Чому кілька вказівників можуть вказувати на одну адресу в C

1

C можна створювати як хаос, так і ясність при роботі з пам’яттю. У вас може бути безліч покажчиків, спрямованих на ту саму ділянку оперативної пам’яті. Це не є помилкою. Це особливість.

Розглянемо сценарій, в якому ви оголошує цілісну змінну i. Потім ви створюєте три цілих вказівники: p, q і r.

`

Код робить саме те, що ви, можливо, очікуєте. p отримує адресу i. q робить те саме. r копіює те, що зберігається в p. Оскільки p містить адресу i, r також вказує на i.

Після виконання цих присвоювань у вас є одна змінна із чотирма іменами. i – це оригінальна змінна. * p звертається до неї. *q звертається до неї. *r звертається до неї.

Як працює привласнення покажчиків

Ключовий момент тут зрозуміти, що відбувається під час присвоєння. Коли ви пишете q = &i, ви не копіюєте значення i. Ви копіюєте розташування i.

Коли ви пишете r = p, ви копіюєте адресу з p до r. Нова пам’ять не вирізняється. Дані не дублюються. Значення адреси переміщається з однієї змінної-покажчика до іншої.

Це означає, що немає жорсткого обмеження на кількість покажчиків, які можуть зберігати ту саму адресу. Ви можете створити тисячу покажчиків, що вказують на i. Всі вони посилаються на те саме місце в пам’яті.

Немає обмеження на кількість покажчиків, які можуть зберігати (і, отже, вказувати на) ту саму адресу.

Ця поведінка є фундаментальною для того, як C управляє пам’яттю. Воно дозволяє створювати гнучкі структури даних, такі як зв’язкові списки та дерева. Воно також забезпечує ефективну передачу аргументів функції. Передавайте вказівник замість копії. Змінюйте вихідні дані безпосередньо.

Але це також створює ризик. Змініть i через p. Подивіться на i через q. Зміна буде помітна скрізь. Існує єдине джерело істини.

Змінна i тепер має чотири імені. i. * p. *q. *r.

Так працює C. У вас є прямий доступ до адрес пам’яті. Ви можете вільно створювати аліаси для даних. Вам просто потрібно бути обережним із тим, що ви змінюєте.