В языке C одна и та же область памяти может иметь несколько псевдонимов. Вы можете объявить несколько указателей и заставить их все ссылаться на одну и ту же переменную. Это не просто особенность языка, а фундаментальная возможность, которая меняет подход к управлению памятью и доступу к данным.
Рассмотрим такой сценарий. Вам нужно несколько ссылок на одну и ту же целочисленную переменную. Вы можете объявить их все и мгновенно связать их.
В этом фрагменте кода p, q и r — это все указатели на целые числа. Все они указывают на i. Присваивание r = p не копирует значение i. Оно копирует адрес, хранящийся в p. Поскольку p содержит адрес i, r теперь также содержит адрес i.
Одна переменная, много имён
После выполнения кода в памяти существует одна целочисленная переменная i. Однако обратиться к этим данным можно четырьмя способами.
i: Имя исходной переменной.*p: Значение по адресу, хранящемуся вp.*q: Значение по адресу, хранящемуся вq.*r: Значение по адресу, хранящемуся вr.
Они идентичны. Измените i. Изменится *p. Измените *q. Изменится i. Данные находятся по одному адресу. Указатели — это просто метки.
Нет жёсткого ограничения на количество указателей, которые могут хранить один и тот же адрес. Вы можете цепочечно связывать их неограниченно. Конструкция a = &i; b = a; c = b; d = c; работает так же. Каждое присваивание копирует значение указателя. Оно не создаёт новую копию данных.
«Любое количество указателей может указывать на один и тот же адрес.»
Эта возможность мощна при передаче ссылок между функциями или построении связанных структур. Она позволяет экономно использовать память. Однако она также несёт риск. Если вы разыменуете один из этих указателей, вы обращаетесь к одним и тем же базовым байтам. Ошибка в одном псевдониме отразится на всех остальных. Но при правильном использовании эта возможность является стандартной практикой в C.




























