Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 4 (Покажчики).docx
Скачиваний:
20
Добавлен:
16.05.2015
Размер:
86.31 Кб
Скачать

Багаторівнева непряма адресація

       У мові Сі можна використовувати багаторівневу непряму адресацію, тобто непряму адресацію на 1, 2 і т.д. рівні. При цьому для оголошення і звертання до значень за допомогою покажчиків можна використовувати відповідно кілька символів зірочка: *. Зірочки при оголошенні ніби уточнюють призначення імені змінної, визначаючи рівень непрямої адресації для звертання до значень за допомогою цих покажчиків. Приклад оголошення змінної і покажчиків для багаторівневої непрямої адресації можна привести наступний:

int i = 123 /* де: i - ім'я змінної */

int *pi = &i; /* pi - покажчик на змінну і */

int **ppi = π /* ppi - покажчик на покажчик на змінну pi */

int ***pppi = &ppi; /* pppi - покажчик на 'покажчик на 'покажчик на змінну ppi' */

       

Операції над покажчиками

Мова Сі надає можливості для виконання над покажчиками операцій присвоювання, цілочисельної арифметики та порівнянь. Мовою Сі можливо:

  • присвоїти покажчику значення адреси даних, або нуль;

  • збільшити (зменшити) значення покажчика;

  • додати або відняти від значення покажчика ціле число;

  • скласти або відняти значення одного покажчика від іншого;

  • порівняти два покажчики за допомогою операцій відношення.

 Усі названі дії над покажчиками будуть наведені у прикладах програм даного розділу. Розглянемо кілька простих прикладів дій над покажчиками.

Зміну значень покажчика можна робити за допомогою операцій: +, ++, -, --. Бінарні операції (+ та -) можна виконувати над покажчиками, якщо обидва покажчики посилаються на змінні одного типу, тому що об'єм ОП для різних типів даних може вирізнятися.

Наприклад, значення типу int займає 2 байти, а типу float - 4 байти. Додавання одиниці до покажчика додасть "квант пам'яті", тобто кількість байтів, що займає одне значення типу, що адресується. Для покажчика на елементи масиву це означає, що здійснюється перехід до адреси наступного елемента масиву, а не до наступного байта. Тобто значення покажчика при переході від елемента до елемента масиву цілих значень буде збільшуватися на 2, а типу float - на 4 байти. Результат обчислення покажчиків визначений у мові Сі як значення типу int.

Приклад програми зміни значення покажчика на 1 квант пам'яті за допомогою операції "++" і визначення результату обчислення покажчиків даний на такому прикладі:

#include<stdio.h> void main () {      int a[] = {100, 200, 300 };

int *ptr1, *ptr2;

ptr1=a; /*- ptrl одержує значення адреси а[0] */

ptr2 = &a[2]; /*- ptr2 одержує значення адреси а[2] */

ptr2++; /* збільшення значення ptr2 на квант ОП: ptr2 = &а[3]*/

printf ("\n\n\t ptr2 - ptr1 = %d\n", ptr2 - ptr1);

printf ("\n\t Елемент а[0]=%d\n", *ptr1);

ptr1++;

printf ("\n\t Елемент а[1]=%d\n", *ptr1);

ptr1++;

printf ("\n\t Елемент а[2]=%d\n", *ptr1);

ptr1++;

printf ("\n\t!Елемент а[3]=%d\n", *ptr1);

}

Результат виконання програми:

Проблеми, пов'язані з покажчиками

      Проблеми, пов'язані з покажчиками, виникають при некоректному використанні покажчиків. Усі застереження щодо некоректного використання покажчиків відносяться до мови Сі так само, як і до багатьох інших мов програмування.

Некоректним використанням покажчиків може бути:

  • спроба працювати з неініціалізованим покажчиком, тобто з покажчиком, що не містить адреси ОП, що виділена змінній, наприклад: