Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Main( )




{

int x = 5, y = 10;

printf (“Спочатку x = %d і y = %d. \n”, x, y);

interchange (&x,&y); /* передача адрес функції */

printf (“Тепер x = %d і y = %d. \n”, x, y);

}

interchange (u, v)

int *u, *v; /* u i v є покажчиками */

{

int temp;

temp = *u; /* temp присвоюється значення, на яке вказує u */

*u = *v;

*v = temp;

}

Результат виконання програми:

Спочатку x = 5 і y = 10.

Тепер x = 10 і y = 5.

Таким чином шляхом передачі функції адрес змінних x і y ми представили їй можливість доступу до них. Використовуючи покажчики і операцію *, функція отримує доступ до величин, що поміщені у відповідні комірки пам’яті і міняє їх місцями.

1.2. Класи пам’яті

Класи пам’яті мови Сі дають можливість визначити, з якими функціями пов’язані які змінні і як довго змінна зберігається у програмі. Клас пам’яті дозволяє встановити два факти. По-перше, визначити, які функції мають доступ до змінної. (Межі, до яких змінна доступна, характеризують її “область дії”). По-друге, визначити, як довго змінна знаходиться в пам’яті.

Існує чотири ключових слова що використовуються для опису класів пам’яті: еxstern (для зовнішнього), auto (для автоматичного), static і register (для статичного і регістрового).

Змінні, що визначені поза функцією, є зовнішніми і мають глобальну область дії.

Наприклад:

/* глобальна змінна units */

int units; /* зовнішня змінна */

main ()

{

extern int units;

funct ();

}

 

funct ()

{

extern int units;

....

}

 

Ключове слово extern пропонує компілятору шукати визначення цієї змінної поза функцією. Зовнішні змінні, які визначенні раніше функції, доступні їй навіть якщо не оголошені усередині неї. В даному випадку змінна units буде доступна як функції main (), так і функції funct ().

По замовчуванню змінні, що оголошені усередині функції, є автоматичними і локальними (область дії такої змінної обмежена блоком {}, в якому ця змінна оголошена.) Можна, однак це підкреслити явно з допомогою необов’язкового ключового слова auto.

Приклад:

main ()

{

auto int units;

....

}

 

Автоматична змінна починає існувати при виклику функції, що містить її. Коли функція завершує свою роботу і повертає управління туди, звідки її викликали, автоматична змінна зникає.

Статичні змінні бувають як зовнішніми так і внутрішніми.

Внутрішні статичні змінні мають таку ж область дії, як і автоматичні змінні, однак вони не зникають, коли функція що їх містить, завершує свою роботу. Компілятор зберігає їх значення від одного виклику функції до іншого.

Різниця між зовнішньою змінною і зовнішньою статичною змінною полягає в області їх дії. Звичайна зовнішня змінна може використовуватися функціями в будь-якому файлі, в той час як зовнішня статична змінна може використовуватись тільки функціями того ж самого файлу, причому після визначення змінної.

Регістрові змінні, зберігаються в регістрах центрального процесора, де доступ до них і робота з ними виконується набагато швидше, ніж над звичайними змінними що зберігаються у пам’яті. Однак, якщо кількість доступних регістрів “зайнята”, то змінна стає простою автоматичною змінною.

 

КЛАС ПАМ’ЯТІ КЛЮЧОВЕ СЛОВО ТРИВАЛІСТЬ ІСНУВАННЯ ОБЛАСТЬ ДІЇ  
Автоматичний Auto Тимчасово Локальна  
Регістровий Register Тимчасово Локальна  
Статичний Static Постійно Локальна  
Зовнішній Extern Постійно Глобальна (всі файли)  
Зовнішній статичний Static Постійно Глобальна (один файл)  

 

Класи пам’яті, які перелічені вище пунктирної лінії, оголошуються на внутрішньому рівні.

Класи пам’яті, які перелічені нижче пунктирної лінії, оголошуються на зовнішньому рівні.

1.3. Оголошення масивів

Масив – це набір елементів одного типу, які мають одне і тeж базове ім’я і відрізняються один від одного числовою ознакою.

Синтаксис:

[<специфікація типу>] <оголошувач> [<константний вираз>];

[<специфікація типу>] <оголошувач> [ ];

Масив дозволяє зберігати як єдине ціле послідовність змінних однакового типу. Оголошення масиву визначає тип елементів масиву і його ім’я, а також може визначати число елементів в масиві. Змінна типу масив бере участь у виразах як константа-покажчик на значення що задане специфікацією типу. Якщо специфікація типу опущена, то передбачається тип int.

Оголошення масиву може мати одну з двох синтаксичних форм, вказаних вище. Квадратні дужки, які знаходяться за <оголошувачем>, є ознакою типу масив.

Константний вираз, що знаходиться в квадратних дужках, визначає число елементів в масиві. Індексація елементів масиву починається з нуля. Таким чином, останній елемент масиву має індекс на одиницю менший, ніж число елементів в масиві.

В другій синтаксичній формі константний вираз в квадратних дужках пропущений. Ця форма може бути використана, якщо в оголошені масиву є присутнім ініціалізатор, або масив оголошується як формальний параметр функції, або дане оголошення є посиланням на оголошення масиву десь в іншому місці програми. Однак для багатомірного масиву може бути пропущена тільки перша розмірність.

Для створення масиву компілятору необхідно знати тип даних і належний клас пам’яті, а також повинна бути відома кількість елементів масиву. Масиви можуть мати ті ж типи даних і класи пам’яті що і прості змінні.

Зовнішні і статичні масиви можна ініціалізувати. Автоматичні і регістрові масиви ініціалізувати не можна.

 

Приклади декількох оголошень масивів:

int temp[365]; /* зовнішній масив з 365 цілих чисел */

int days [ ] = {30, 31}; /* ініціалізація зовнішнього масиву */

main ()

{

float rain[365]; /* автоматичний масив з 365 чисел типу float */

static char code[12]; /* статичний масив з 12 символів */

extern temp[ ]; /* зовнішній масив; розмір вказаний вище */

}

 

Багатомірний масив, чи масив масивів, оголошується шляхом задання послідовності константних виразів у квадратних дужках, що знаходяться за оголошувачем:

[<специфікація типу>] <оголошувач> [<константний вираз>] [<константний вираз>]…;

Кожен константний вираз у квадратних дужках визначає число елементів в даному вимірі масиву, тому оголошення двомірного масиву містить два константних вирази, тримірного – три і т.д.

Масиву виділяється пам’ять, яка є необхідною для розміщення всіх його елементів. Елементи масиву з першого по останній розташовуються у послідовних комірках пам’яті, по зростанню адрес. Елементи багатомірного масиву запам’ятовуються по рядках. Наприклад, масив, який представляє собою матрицю розміром два рядки на три стовпці char[ 2 ][ 3 ] буде зберігатися наступним чином: спочатку в пам’яті запам’ятовуються три елементи першого рядка, потім три елементи другого рядка.

1.4. Покажчики масивів

Позначення масиву представляє собою неявну форму використання покажчиків. Наприклад, ім’я масиву визначає також його перший елемент, тобто якщо dates[ ] –масив, тоді

dates = = & dates[0]

і обидві частини рівності визначають адресу першого елемента масиву. Обидва позначення є константами типу покажчик, оскільки вони не змінюються на протязі всієї програми. Однак їх можна присвоювати (як значення) змінній типу покажчик і змінювати значення цієї змінної.

Приклад:

#include <stdio.h>

void main (void)

{

int dates[4];

int i, *pt;

for (i = 0; i < 4; i++)

scanf (" %d ", &dates[i]);

pt = dates; /* присвоєння адресу покажчику масиву */

for (i = 0; i < 4; i++)

printf (" %d %р\n", pt[i], &pt[i]);

}

Якщо ми присвоюємо 4-м елементам масиву наступні значення: 23, 65, 89, 7, то результат виконання програми буде наступним:

23 325D:OF84

65 325D:OF86

89 325D:OF88

7 325D:OF8A

 

У другому стовпці виведені адреси комірок в яких знаходяться значення елементів масиву.

Таким чином, якщо dates визначає адресу першого елемента масиву то * (dates) – його значення.

 

Наприклад:

dates + 2 = = & dates[2] /* адрес 3-го елемента масиву */

*(dates + 2) = = dates[2] /* значення 3-го елемента масиву */

Дані співвідношення показують можливість використання покажчика для визначення окремого елемента масиву, а також знаходження його значення.

Масиви можна використовувати в програмі в якості аргументів функції.

Коли ім’я масиву використовується в якості аргументу, функції передається покажчик. Далі функція використовує цей покажчик для виконання змін у вихідному масиві.

Скелет даної програми продемонстрований на прикладі.

Приклад:

main()

{

int ages[50]; /* масив з 50 елементів */

convert(ages);

....

}

 

convert(years)

int years[ ]; /* покажчик на масив*/

{

....

}

 

ages – аргумент функції convert, що є покажчиком на перший елемент масиву. Таким чином, оператор виклику функції передає їй покажчик, тобто адресу функції convert(). Це означає що аргумент функції є покажчиком, тому функцію convert() можна записати наступним чином:

convert(int years[ ])

{

....

}

 

Оператор int years[ ]; оголошує змінну years покажчиком масиву цілих чисел. Оператори, що використовують покажчик years у функції convert(), фактично працюють з масивом ages, що знаходиться в тілі функції main ()

У випадку використання двомірного масиву порядок його елементів визначається тим, що найправіший індекс масиву змінюється першим. Тому, наприклад, якщо ми маємо оголошення:

int dear[3][2]; /* масив типу int із 3-ох стрічок і 2-ох стовпців */

int *pr; /* покажчик на цілий тип */

тоді pr = dear вказує адрес елемента першого стовпця першого рядка:

dear = = &dear[0][0]

 

Тоді:

pr + 1= = &dear[0][1] /* 1-й рядок, 2-й стовпець */

pr + 5 = = &dear[2][1] /* 3-й рядок, 2-й стовпець */

 

Визначення і опис функції що керує двомірним масивом записується наступним чином:

main ()

{

static int dear[3][4];

convert(dear);

....

}

 

convert(dear)

int dear[ ][4];

{

....

}

 

Оператор int dear[ ][4]; повідомляє компілятор про необхідність розбиття масиву на рядки по чотири стовпці.

Приклад програми яка здійснює сортування елементів масиву методом обміну:

 

#include <stdio.h>

#include <stdlib.h>

#define n 5

void bul(int a[n][n]);




Поделиться с друзьями:


Дата добавления: 2015-01-03; Просмотров: 383; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.05 сек.