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









































