Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вказівники та посилання.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
857.42 Кб
Скачать

9.2 Оголошення та звертання в одновимірних масивах

Форма оголошення одновимірного масиву з явною вказівкою кількості елементів масиву:

тип ім'я_масива [кількість-елементів-масива];

Звертання до елементів одновимірного масиву в загальному випадку можна представити індексуванням, тобто у вигляді

ім'я-масива [вираз]; де ім'я-масиву - вказівник-константа;

вираз - індекс, число цілого типу; він визначає зсув - збільшення адреси заданого елемента масиву щодо адреси нульового елемента масиву.

Елементи одновимірного масиву розташовуються в ОП підряд: нульовий, перший і т д. Приклад оголошення масиву:

int а[10];

int *p = а; /* - р одержує значення а */

При цьому компілятор виділяє масив в стеку ОП розміром (sizeof(Type) * розмір-масиеу) байтів.

У вищенаведеному прикладі це 2 * 10 = 20 байтів. Причому а -вказівник-константа, адреса початку масиву, тобто його нульового елемента, р - змінна; змінній р можна присвоїти значення одним із способів:

р = а;

р = &а[0];

р = &a[i];

де &а[і] == (а + і) - адреса і-елемента масиву.

Відповідно до правил перетворення типів значення адреси i-елемента масиву на машинному рівні формується таким чином:

&а^]= а + i * sizeof(int) ;

Справедливі також наступні співвідношення:

&a == a+0 == &a[0] - адреса а[0] - нульового елемента масиву;

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

а+i == &a[i] - адреса a[i] - i-го елемента масиву;

*а==* (а+0) ==* (&а[0]) ==a[0] - значення 0-ого елемента масиву;

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

*(а + i) == а [i] - значення a[i] - i-го елемента масиву;

* а + 2 == а[0] + 2 - сума значень а[0] і 2.

Якщо р - покажчик на елементи такого ж типу, які і елементи масиву a та p=a, то а та р взаємозамінні; при цьому:

p == &a[0] == a + 0;

p+2 == &a[2] == a + 2;

*(p + 2) == (&a[2]) == a[2] == p[2];

*(p + i) == (&a[i]) == a[i] == p[i];

Для a та p еквівалентні всі звертання до елементів a у вигляді:

a[i], *(a+i), *(i+a), i[a], та p[i],

*(p+i), *(i+p), i[p]

9.3 Оголошення та звертання до багатовимірних масивів

У даному розділі розглянемо оголошення і зв'язок вказівників і елементів багатомірних масивів - що мають 2 та більше вимірів.

Багатомірний масив у мові Сі розглядається як сукупність масивів меншої розмірності. Наприклад, двовимірний масив - це сукупність одновимірних масивів (його рядків), тривимірний масив - це сукупність матриць, матриці - сукупності рядків, а рядок - сукупність елементів одновимірного масиву.

Елементи масивів розташовуються в ОП таким чином, що швидше змінюються самі праві індекси, тобто елементи одновимірного масиву розташовуються підряд, двовимірного - по рядках, тривимірного - по матрицях, а матриці - по рядках.

Для звертання до елементів багатомірного масиву можна використовувати нуль і більш індексів (індексних виразів):

ім'я-масиву [вираз1][вираз2] ...

Наприклад, для звертання:

• до одновимірного масиву можна використовувати одно-індексний вираз (індекс);

• до двовимірного - 1 або 2 індексний вираз;

• до тривимірного - 1, 2 або 3 індексний вираз і т.д.

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

Приклад оголошення двовимірного масиву значень типу int:

int а^]^] ;

Цей масив складається з m одновимірних масивів (рядків), у кожному з яких утримується n елементів (стовпців). При роботі з цим двовимірним масивом можна використовувати одно або 2 індексний вираз. Наприклад:

а[і] [j]- містить 2 індекси; використовується для звертання до елемента і-рядка, j-стовпця масиву; обчислюються індексні вирази, визначається адреса елемента масиву і вилучається його значення;

a[i] - містить 1 індекс; визначає адресу одновимірного масиву: адреса початку і-рядка масиву;

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

Таким чином, звертання до двовимірних масивів за допомогою імені і тільки одного індексу визначає покажчик на початок відповідного рядка масиву (адреса його нульового елемента). Наприклад:

а[0] == &a[0][0] == a+0*n*sizeof(int);

а[1] == &а[1][0] == a+1*n*sizeof(int);

a[i] == &a[i][0] == a+i*n*sizeof(int);

Приклад оголошення тривимірного масиву:

int a[k][m][n] ;

- k- кількість матриць з m рядками і n стовпцями;

- m - кількість рядків (одновимірних масивів) у матриці;

- n - кількість стовпців (елементів у рядку) матриці.

Цей масив складається з k матриць, кожна з яких складається з m одновимірних масивів (рядків) по n елементів (стовпців). При звертанні до цього масиву можна використовувати імена:

a[l][i][j] - містить 3 індекси; використовується для звертання до елемента l-матриці, і-рядка. j-стовпця масиву; обчислюються індексні вирази, визначається адреса елемента масиву і вилучається його значення;

a[k] [i] - визначає одновимірний масив - адреса початку і-рядка; k -матриці;

a[k] - визначає двовимірний масив - адреса початку k - матриці, тобто нульового елемента його нульового рядка;

а - адреса початку масиву, нульового елемента нульового рядка нульової матриці.

Наприклад:

int b[3][4][5];

int i, *ip, *ipp; i = b[0][0] [1];

де: ір, ірр - покажчики на значення типу int.

Після ip = b[2][0]; ip є покажчиком на елемент 0-рядка 0-го стовпця 2-й матриці масиву, тобто Ь[2][0][0].

Після ipp = b[2]; ipp адресує 0-й рядок 2-ї матриці масиву, тобто містить адреса b[2] [0] [0].

де:

ipp b[2] [0]; = b[2];

Звертання до елементів багатомірного масиву більш детально розглянемо на прикладі двовимірного масиву. Наприклад: