Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samostoyatelnye_po_S.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
672 Кб
Скачать
☆

Методи доступу до елементів масивів

У мові С між покажчиками і масивами існує тісний зв'язок. Наприклад, коли оголошується масив у вигляді int array [25], то цим визначається не тільки виділення пам'яті для двадцяти п'яти елементів масиву, але і для покажчика з ім'ям array, значення якого дорівнює адресою першого за рахунком (нульового) елемента масиву, т.е . сам масив залишається безіменним, а доступ до елементів масиву здійснюється через покажчик з ім'ям array. З точки зору синтаксису мови покажчик arrey є константою, значення якої можна використовувати у вираженнях, але змінити це значення не можна.

Оскільки ім'я масиву є покажчиком допустимо, наприклад, таке присвоєння:

int arrey [25];

int * ptr;

ptr = array;

Тут покажчик ptr встановлюється на адресу першого елемента масcіва, причому присвоювання ptr = arrey можна записати в еквівалентній формі ptr = & arrey [0].

Для доступу до елементів масиву існує два різні способи. Перший спосіб пов'язаний з використанням звичайних індексних виразів у квадратних дужках, наприклад, array [16] = 3 або array [i +2] = 7. При такому способі доступу записуються два вирази, причому другий вираз полягає у квадратні дужки. Одне з цих виразів повинно бути дороговказом, а друге - виразом цілого типу. Послідовність запису цих виразів може бути будь-який, але в квадратних дужках записується вираз наступне другим. Тому записи array [16] і 16 [array] будуть еквівалентними і позначають елемент масиву з номером шістнадцять. Покажчик використовуваний в індексному вираженні не обов'язково повинен бути константою, що вказує на який-небудь масив, це може бути і змінна. Зокрема після виконання присвоювання ptr = array доступ до шістнадцятого елементу масиву можна отримати за допомогою покажчика ptr у формі ptr [16] або 16 [ptr].

Другий спосіб доступу до елементів масиву пов'язаний з використанням адресних виразів і операції разадресаціі у формі * (array +16) = 3 або * (array + i +2) = 7. При такому способі доступу адресний вираз рівне адресою шістнадцятого елемента масиву теж може бути записано різними способами * (array +16) або * (16 + array).

При реалізації на комп'ютері перший спосіб приводиться до другого, тобто індексне вираз перетвориться до адресного. Для наведених прикладів array [16] і 16 [array] перетворяться в * (array +16).

Для доступу до початкової елементу масиву (тобто до елементу з нульовим індексом) можна використовувати просто значення покажчика array або ptr. Будь-яке з присвоюванням

* Array = 2;

array [0] = 2;

* (Array +0) = 2;

* Ptr = 2;

ptr [0] = 2;

* (Ptr +0) = 2;

присвоює початкового елементу масиву значення 2, але швидше за все виконаються присвоювання * array = 2 і * ptr = 2, так як в них не потрібно виконувати операції додавання.

Покажчики на багатовимірні масиви

Покажчики на багатовимірні масиви в мові СІ - це масиви масивів, тобто такі масиви, елементами яких є масиви. При оголошенні таких масивів у пам'яті комп'ютера створюється кілька різних об'єктів. Наприклад при виконанні оголошення двовимірного масиву int arr2 [4] [3] в пам'яті виділяється ділянка для зберігання значення змінної arr, яка є покажчиком на масив з чотирьох покажчиків. Для цього масиву з чотирьох покажчиків теж виділяється пам'ять. Кожен з цих чотирьох покажчиків містить адресу масиву з трьох елементів типу int, і, отже, в пам'яті комп'ютера виділяється чотири ділянки для зберігання чотирьох масивів чисел типу int, кожен з яких складається з трьох елементів.

Таким чином, оголошення arr2 [4] [3] породжує в програмі три різних об'єкта: покажчик з ідентифікатором arr, безіменний масив з чотирьох покажчиків і безіменний масив із дванадцяти чисел типу int. Для доступу до безіменним масивам використовуються адресні вирази з покажчиком arr. Доступ до елементів масиву покажчиків здійснюється із зазначенням одного індексного виразу у формі 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] з тривимірного масиву теж можнo використовувати покажчик, описаний як 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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]