Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lexzii_08 / lexs_3_Mas.doc
Скачиваний:
20
Добавлен:
17.05.2015
Размер:
120.32 Кб
Скачать

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

Розглядаємо оголошення і зв’язок покажчиків і елементів багатовимірних масивів, тобто таких, які мають 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.

Соседние файлы в папке lexzii_08