Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

Void * p;

int i;

float f;

p=&i;

p=&f;

Однак отримати значення покажчика на тип void, використовуючи його в арифметичному виразі, не можна. У виразах *v чи v++ буде помилка. Для того, щоб покажчик на тип void можна було використовувати, необхідно застосовувати операцію явного зведення типу. Наприклад:

(тип*) <ідентифікатор>:

j=(int*)v;

*((int*)v)++;

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

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

Дії над покажчиками:

1) можна порівнювати їх з нулем i присвоювати їм значення 0;

2) якщо р i q – покажчики на елементи одного масиву, то їх можна порівнювати;

3) до покажчика можна додавати ціле число. При цьому адреса зміниться із врахуванням розміру типу даних, на який указував покажчик.

Якщо описано int * p;, то p+4 міститиме адресу елемента типу int, розміщеного на відстані чотирьох таких елементів від p:

4) від покажчика можна віднімати ціле число;

5) допускається віднімання показчиків p i q – у результаті отримуємо кількість елементів між p i q.

Масиви. Синтаксично масив задається як

[<тип>]<описувач>[ ]

або

[<тип>]<описувач>[константний вираз]

Наприклад:

Int array[12];

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

Описувач не може бути функцією чи мати тип void. Не допускається масив типу void. Індексація масивів починається з 0.

Такі конструкції використовуються, якщо в оголошенні присутній iнiцiалiзатор або масив оголошується як формальний параметр функції, або дане оголошення є посиланням на оголошення масиву в іншому місці програми. Наприклад:

int a[]={1,2,3}

Void f(int a[])

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

[<тип>]<описувач>[<конст. вираз1>][<конст. вираз2>]...

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

Елементи багатовимірних масивів розміщуються по рядках.

Ініціалізація масивів здійснюється так:

int a[ ]={1,2,3};

int a[3][2]={{1,2},{3,4},{6,7}};

Причому присутність внутрішніх дужок необов'язкова.

Індексний вираз. У мові С існує поняття індексного виразу, який задається за допомогою квадратних дужок. Його значення обчислюється за такою схемою: до покажчика додається константний вираз у дужках, а потім береться значення утвореного покажчика. Якщо описати, наприклад, покажчик int *p; то можна використовувати індексний вираз p[const], еквівалентний конструкції *(p+const), де const – деякий константний вираз. Аналогічно, якщо описано масив int a[5]; то можна використовувати конструкцію вигляду *(а+3), еквівалентну а[3].

За синтаксичною схемою індексного виразу допускаються й від'єм­ні індекси масивів: a[-3]. Якщо описати масиви

int a[3]={1,3,5};

int b[4]={2,4,6,8};

то b[-1]==5, b[-2]==3, b[-3]==1.

Механізм обчислення індексного виразу допускає можливість зміни порядку наступності константного виразу та покажчика (чи імені масиву). Тому запис a[4] еквівалентний 4[a] (адже значення виразів *(a+4) та *(4+a) однакові).

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

int a[4],*pa;

pa=a;

Тоді pa[0]==a[0], pa[1]==a[1] і т. д.

Можемо присвоїти покажчику pa та адресу будь-якого іншого елемента масиву а: pa=&a[2]; Тоді pa[0]==a[2], pa[1]==a[3] і т. д.

Однак між покажчиком і масивом існує суттєва відмінність. Покажчик – це змінна, а ім'я масиву – специфічний об'єкт, його не можна змінювати. Наприклад, не допускається застосування операцій інкремента та декремента до імені масиву, не можна імені масиву присвоїти інше значення. Очевидно, що функції можна передавати й частину масиву. Наприклад: