Декілька вказівників, що вказують на одну адресу пам’яті

3

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

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

`

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

Після виконання цих рядків у вас немає трьох окремих змінних, які розкидані по пам’яті. У вас є одна змінна із чотирма псевдонімами.

  • i
  • *p
  • *q
  • *r

Всі вони являють собою одну й ту саму річ.

Це тому, що привласнення покажчика — це копіювання значення адреси. Адреса з правої частини присвоєння переміщається до змінної лівої частини. Глибоке копіювання даних не відбувається. Надсилається лише адреса пам’яті.

Тут немає обмежень. Ви можете зв’язувати ланцюжком скільки завгодно покажчиків. `a = b; c = b; d = c; – це не має значення. Всі вони вказують на те саме місце в оперативній пам’яті.

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

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

Це також означає потребу обережності. Змініть *p на 5. Що станеться з i? Воно стане 5. Змініть *q? i зміниться знову. Усі псевдоніми бачать одне й те саме оновлення.

Це основа C. Але це потужний інструмент. І небезпечний, якщо ви втратите контроль над тим, який покажчик на що вказує.