|
Покажчики на багатомірні масиви в мові С - це масиви масивів, тобто такі масиви, елементами яких є масиви. При оголошенні таких масивів у пам'яті комп'ютера створюється кілька різних об'єктів.
Наприклад, при виконанні оголошення двовимірного масиву int arr2[4][3] у пам'яті виділяється область для збереження значення перемінної arr, що є покажчиком на масив з чотирьох покажчиків. Для цього масиву з чотирьох покажчиків теж виділяється пам'ять. Кожний з цих чотирьох покажчиків містить адресу масиву з трьох елементів типу int, і, отже, у пам'яті комп'ютера виділяється чотири області ля збереження чотирьох масивів чисел типу int, кожний з яких складається з трьох елементів. Таке виділення пам'яті показане на схемі на рис. 9.1.
Таким чином, оголошення arr2[4][3] породжує в програмі три різних об'єкти: покажчик з ідентифікатором arr, безіменний масив з чотирьох покажчиків і безіменний масив із дванадцяти чисел типу int. Для доступу до безіменних масивів використовуються адресні вираження з покажчиком arr.
arr | ||||
в | ||||
arr[0] | а | arr[0][0] | arr[0][1] | аrr[0][2] |
arr[1] | а | arr[1][0] | arr[1][1] | аrr[1][2] |
arr[2] | а | arr[2][0] | arr[2][1] | аrr[2][2] |
arr[3] | а | arr[3][0] | arr[3][1] | аrr[3][2] |
Рис. 9.1. Розподіл пам’яті для двовимірного масиву |
Доступ до елементів масиву покажчиків здійснюється з вказівкою одного індексного вираження у формі arr2[2] або *(arr2+2). Для доступу до елементів двовимірного масиву чисел типу int повинні бути використані два індексних вираження у формі arr2[1][2] або еквівалентних їй *(*(arr2+1)+2) і (*(arr2+1))[2]. Варто враховувати, що з погляду синтаксису мови С покажчик arr і покажчики arr[0], arr[1], arr[2], arr[3] є константами і їхнього значення не можна змінювати під час виконання програми.
Розміщення тривимірного масиву відбувається аналогічно й оголошення float arr3[3][4][5] породжує в програмі крім самого тривимірного масиву із шістдесятьох чисел типу float масив з чотирьох покажчиків на тип float, масив із трьох покажчиків на масив покажчиків на float, і покажчик на масив масивів покажчиків на float.
При розміщенні елементів багатомірних масивів вони розташовуються в пам'яті підряд по рядках, тобто швидше всього змінюється останній індекс, а повільніше - перший. Такий порядок дає можливість звертатися до будь-якого елемента багатовимірного масиву, використовуючи адресу його початкового елемента і тільки одне індексне вираження.
Наприклад, звертання до елемента arr2[1][2] можна здійснити за допомогою покажчика ptr2, оголошеного у формі int *ptr2=arr2[0] як звертання ptr2[1*4+2] (тут 1 і 2 це індекси використовуваного елемента, а 4 це число елементів у рядку) або як ptr2[6]. Відзначемо, що зовні схоже звертання arr2[6] виконати неможливо тому, що покажчика з індексом 6 не існує.
Для звертання до елемента arr3[2][3][4] із тривимірного масиву теж можна використовувати покажчик, описаний як float *ptr3=arr3[0][0] з одним індексним вираженням у формі ptr3[3*2+4*3+4] або ptr3[22].
Далі наведена функція, що дозволяє знайти мінімальний елемент у тривимірному масиві. У функцію передається адреса початкового елемента і розміри масиву. Значення, що повертається, – це покажчик на структуру, що містить індекси мінімального елемента.
struct INDEX {int i,
int j,
int k }min_index;
struct INDEX * find_min (int *ptr1, int l, int m int n)
{ int min, i, j, k, ind;
min=*ptr1;
min_index.i=min_index.j=min_index.k=0;
for (i=0; i*(ptr1+ind)
{ min=*(ptr1+ind);
min_index.i=i;
min_index.j=j;
min_index.k=k;
}
}
return &min_index;
}
Дата добавления: 2015-07-20; просмотров: 97 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Зв’язок між покажчиками та масивами | | | Масиви покажчиків |