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



























