
- •Лекція 3.
- •Масиви даних і покажчики.
- •Способи оголошення і звернення до елементів одновимірних масивів.
- •Засоби оголошення і звернення до елементів багатовимірних масивів.
- •Розглянемо програму, яка впорядковує рядки заданого масиву в порядку
- •Результати роботи програми такі:
- •Взаємозв’язок між масивами і покажчиками
- •Приклад
- •Питання для самоконтролю.
Засоби оголошення і звернення до елементів багатовимірних масивів.
Розглядаємо оголошення і зв’язок покажчиків і елементів багатовимірних масивів, тобто таких, які мають 2 і більше вимірювань. Багатовимірний масив в Сі розглядається як сукупність масивів меншої розмірності. Наприклад: двохвимірний масив – це сукупність одновимірних масивів, трьохвимірний – сукупність матриць, матриці – сукупність рядків, а рядок – сукупність елементів одновимірного масиву.
Елементи масивів розташовуються у пам’яті таким чином, що швидше змінюються самі праві індекси, тому при звертанні до елементів масиву використовують нуль і більше індексів. Приклад оголошення двохвимірного масиву в загальному випадку int a[m] [n];
Звернення до двохвимірного масиву за допомогою імені і тільки одного індексу визначає покажчик на початок відповідного рядка масиву (адреса його нульового елемента).
Наприклад:
a[0]==&a[0][0]==a+0*n*sizeof(int);
a[1]==&a[1][0]==a+1*n*sizeof(int);
a[i]==&a[i][0]==a+i*n*sizeof(int);
Приклад оголошення трьохвимірного масиву.
int a[L][m][n];
де L – кількість матриць з m рядками і n стовпцями;
m – кількість рядків(одновимірного масиву) в матриці;
n – кількість стовпців(елементів в рядку) матриці;
Цей масив складається із L матриць, кожна з яких складається із m одновимірних масивів по n елементів. При зверненні до цього масиву можна використовувати імена:
a[k][i][j] – містить 3 індекса; k – матриця, i – рядок, j – стовпці; обчислюються індексні вирази, визначається адреса елементів масиву і здобувається його значення.
a[k][i] – визначає одновимірний масив – адреса початку i-го рядка k-ї матриці;
a[k] – визначає двохвимірний масив – адресу початку k-ї матриці; тобто нульового елемента його нульового рядка;
a – адреса початку масиву, нульового елемента нульового рядка нульової матриці.
Наприклад:
int b[3][4][5];
int і, *ір, *ірр;
і=b[0][0][1]; ip=b[2][0]; ipp=b[2];
де ір, ірр – покажчики на значення типу int.
Після ір=b[2][0]; ip є покажчиком на елемент 0-рядка, 0-го стовпця 2-ї матриці масиву, тобто
b[2][0][1].
Після ірр=b[2]; ipp адресує 0-й рядок 2-ї матриці масиву, тобто має адресу b[2][0][0].
Звернення до елементів багатовимірного масиву більш детально розглянемо на прикладі двохвимірного масиву. Наприклад:
int а[3][4]; а – покажчик-константа
int *р=а; р – покажчик-змінна
Після цього покажчик р можна використовувати замість покажчика а для звернення до рядків або елементів масиву а в вигляді ім’я покажчика і зміщення елемента відносно адреси початку масиву а.
В ОП елементи розташовані таким чином:
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] … a[2][0] a[2][1] a[2][2] a[2][3]
При цьому для звернення до масиву а можливо використовувати і імена:
&a=a=&a[0][0]=*a – адреса a[0][0] елемента 0-го рядка 0-го стовпця матриці а;
**a=*(&a[0][0])=a[0][0] – значення елемента – // –// –
a[i]=(a+i)=*(a+i)=&a[i][0] – адреса початку i-го рядка: адреса елемента i-го рядка 0-го стовпця
*a[i]=**(a+i)=*(&a[i][0])=a[i][0] – значення 0-го елемента i-го рядка.
a[i][j]=*(*(a+i)+j)=*(a[i]+j)=a[i][j] – значення елемента i-го рядка, j-го стовпця.
Де (a+i)=*(a+i)=a[i] – адреса 0-го елемента i-го рядка =&a[i][0]
(*(a+i)+j) – адреса j-го елемента і-го рядка =&a[i][j].
Важливо пам’ятати, що покажчик – це змінна у=a, або у++ - допустимі операції. Ім’я масиву – константа. Тому конструкції виду a=у, а++, z=&a використовувати не можна, тому що значення константи не можна змінювати.
В мові Сі допустимі масиви покажчиків, які оголошуються таким чином:
char *m[5]; Тут m[5] – масив, який містить адресу елементів типу char.