Почему несколько указателей могут указывать на один адрес в C

12

В 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. У вас есть прямой доступ к адресам памяти. Вы можете свободно создавать алиасы для данных. Вам просто нужно быть осторожным с тем, что вы изменяете.