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

6 Покажчики

6.1 Визначення та ініціалізація покажчиків

Типова ЕОМ має масив послідовно нумерованих або адресованих комірок (секцій) пам'яті, якими можна маніпулювати окремо або прилеглими групами. Кожна з яких має мінімальний розмір один байт. Комірки нумеруються послідовно.

Рисунок 6.1 – Послідовна нумерація комірок пам’яті

На рисунку 5.1 адреси комірок зображуються у вигляді двокрапки та номера комірки . Наприклад , «:1979».

Покажчик – це група комірок (часто дві або чотири), що можуть зберігати адресу.

Синтаксис визначення покажчика наступний:

<тип> *<ім’я покажчика>

де тип – це тип даних на який вказує покажчик;

ім’я покажчикаідентифікатор.

Приклад 6.1. Присвоєння адреси змінній (рис. 6.2)

int a; /* змінна типу int */

p = 13; /* присвоєння змінній значення */

int * p; /* p є покажчиком на int */

p = &a; /* операція взяття адреси присвоєння

адреси a змінній p */

Приклад 6.2. Змінна та її адреса (рис. 6.3)

а = 13; /* присвоєння змінній значення */

varsecond = а; /* запис значення а в змінну varsecond */

p = &a; /* операція присвоєння адреси a змінній p */

Покажчик визначається наступним чином:

<тип> *< ідентифікатор> = <ініціалізатор>;

Під ініціалізатором розуміється якась адреса змінної (тоді необхідно використати взяття адреси змінної &) або вже існуючий покажчик.

а)

б)

а) Представлення змінної

б) Детальна схема присвоєння адреси змінній

Рисунок 6.2

Рисунок 6.3 – Змінна та її адреса

6.2 Визначення покажчиків

Приклад 6.3. Синтаксис покажчика

int* p = &a; /* покажчик р містить значення адреси

змінної а */

float* ptr (NULL); /* нульовий покажчик на об’єкт типу

float */

char* p; /* неініціалізований покажчик на

об’єкт типу char */

Значення адреси змінної одержується за допомогою унарної операції ”&”. Розглянемо код з виводом в консольне вікно:

Приклад 6.4. Використання операції ”&” (рис. 6.4)

#include <stdlib.h>

int main()

{

int a = 8;

int * p = &a;

printf(" p=%i, &p=%i, a=%i, &a=%i \n", p, &p, a, &a);

system("PAUSE");

return EXIT_SUCCESS;

}

Результат роботи програми:

Рисунок 6.4 – Схема даних в памяті

В змінній а зберігається значення 8, в покажчику р зберігається значення адреси а, тобто р вказує на комірку з індифікатором а.

Якщо ж операція «*» використовується не при ініціалізації покажчика то ця операція має назву розіменовування:

Приклад 6.5. Розіменовування покажчика (рис.6.5)

int x=1; /* змінна типу int */

int * y =&x; /* покажчик на елемент даних типу int */

int z =* y; /* через покажчик до поля x вноситься

значення 1 */

Рисунок 6.5 – Розіменовування покажчика

Нехай y – це покажчик на x, що містить адресу. Присвоїти значення z змінній y ми не можемо, тому що це різні типи даних: адреса і значення. Шляхом розіменовування отримуємо значення на яке вказує y і присвоюємо його змінній z.

Унарна операція «*» застосована до покажчика, забезпечує доступ до вмісту комірки пам'яті, на яку посилається покажчик. Наприклад, * y можна описати словами як "те, що міститься за адресою, на який вказує y".

Покажчики можуть використовуватися у виразах. Якщо, покажчик y вказує на ціле x, то * y може у всіх випадках використовуватися замість x; так, * y+1 збільшує x на одиницю, а * y=0 рівносильне x=0. Два оператори присвоювання y = &x; z = * y; виконують те ж саме, що і один оператор z = x. Користь від застосування покажчиків в таких ситуаціях невелика.

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