У C можна створити кілька покажчиків, які вказують на ту саму ділянку пам’яті. Це не є помилкою. Це особливість мови.
Ви можете оголосити три вказівники на цілі числа: p, q та r. Потім ви можете встановити їх все так, щоб вони вказували на одну і ту ж цілісну змінну i.
`
Подивіться, що відбувається. p отримує адресу i. q також отримує адресу i. r отримує те, що зберігається в p. А саме – адреса i.
Після виконання цього коду виникає своєрідна ситуація. У змінної i тепер є чотири назви. Ви можете звертатися до неї через i, *p, *q або *r. Всі вони посилаються на ту саму область в оперативній пам’яті.
Як працює привласнення покажчиків
Коли ви надаєте один покажчик іншому, ви не копіюєте значення, на яке вони вказують. Ви копіюєте адресу.
r = p не копіює ціле число i. Воно копіює адресу пам’яті, що зберігається в p. Оскільки p містить адресу i, r тепер також містить адресу i.
Немає обмеження на кількість вказівників, які можуть розділяти одну адресу. У вас може бути десять покажчиків. Або сто. Всі вони просто вказують на те саме.
Чому це важливо
Ця поведінка змінює ваше уявлення про дані. Одна змінна може мати багато псевдонімів. Якщо ви зміните значення через один покажчик, кожен інший покажчик побачить цю зміну.
`
Тепер i дорівнює 10. *q дорівнює 10. *r дорівнює 10. Всі вони дивляться на ті самі дані.
Це корисно. Це дозволяє передавати посилання функції без копіювання великих структур. Це дозволяє різним частинам вашого коду працювати з одними і тими самими даними. Але це також означає, що треба бути обережним. Зміна через один покажчик може вплинути інші.
Поширені помилки
Деякі розробники-початківці думають, що привласнення покажчиків копіює дані. Це негаразд. Копіюється адреса.
Інші запитують, чи існує обмеження. Його нема. Мова дозволяє створювати стільки вказівників, скільки вам потрібно. Компілятор не заважає цьому.
Підсумок
Декілька покажчиків можуть вказувати на ту саму адресу. Це стандартна поведінка в C. Ви можете надавати вказівники один одному. Копіюється адреса, а чи не значення. Змінна залишається однією і тією ж. Просто збільшується кількість її «імен».
«Немає обмежень на кількість покажчиків, які можуть зберігати (і, отже, вказувати) на ту саму адресу.»
Ця гнучкість потужна. Вона потребує дисципліни. Але вона є фундаментальною для того, як працює C. Якщо ви розумієте це, ви розумієте одну з ключових концепцій управління пам’яттю в C.
























































