Як кілька покажчиків посилаються на одну адресу в C

1

C дозволяє створити «натовп» навколо одного осередку пам’яті. Вам не потрібно обмежуватись одним покажчиком. Будь-яка кількість покажчиків може вказувати на ту саму адресу. Це не є помилкою. Це особливість того, як C обробляє посилання на згадку.

Розглянемо просту змінну цілого типу i. Ви можете оголосити три різні покажчики: p, q та r. Код дуже простий.

`

Подивіться на останній рядок. r вказує на те саме, на що вказує p. А оскільки p вже присвоєно адресу i, r фактично теж вказує на i.

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

Після виконання коду у i з’являється чотири імені. Ви можете звертатися до цілого числа як до i. Ви можете змінювати його через ‘p’. Ви можете читати його через *q. Ви також можете звертатися до нього за допомогою ‘ r’.

Немає межі того, скільки покажчиків можуть зберігати ту саму адресу. Ви можете оголосити s, t та u, якщо хочете. Всі вони будуть просто псевдонімами для однієї і тієї ж ділянки пам’яті.

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

Але це також ризикує. Якщо один покажчик змінює значення, всі покажчики бачать цю зміну. Нема ізоляції. Потрібно бути обережним. Один покажчик змінює ціле число. Інші бачать це негайно.

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

Це базова арифметика покажчиків. Вона фундаментальна розуміння моделей пам’яті в C. Але саме тут починаються труднощі. Декілька посилань на одну адресу означають кілька способів зіпсувати дані.

Ви можете нескінченно ланцюжити привласнення покажчиків. s = r; t = s;. Все це вказує назад на i. Компілятор все одно. Час виконання теж байдуже. Це просто адреси пам’яті.

Чому це важливо для звичайних користувачів? Якщо ви пишете код на C, ви покладаєтеся на це. Якщо ви налагоджуєте падіння програми, це часто є причиною. Помилки використання після звільнення (use-after-free) процвітають у середовищах, де покажчики перепризначаються, але не обнулюються.

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

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

Це проста концепція. Копіюйте адресу. Не копіюйте значення. Дозвольте кілька імен посилатися на одне місце. Використовуйте це мудро.