В C есть особенность, которая сбивает с толку новичков, но при этом обеспечивает работу сложных систем. Вы можете направить десятки указателей на один и тот же адрес памяти.
Рассмотрим простое целочисленное значение i. Вы можете объявить три указателя — p, q и r — и связать их все с ним.
Это не магия. Это просто копирование адреса. Когда вы пишете r = p, компилятор копирует адрес, хранящийся в p, в r. То же самое происходит с q.
Теперь у i есть четыре имени. Это i. Это *p. Это *q. Это *r.
Жёсткого ограничения на это нет. Вы можете иметь сотни указателей, ссылающихся на один и тот же участок оперативной памяти. Каждый из них является отдельной переменной в вашем коде, но все они указывают на одно и то же место в памяти.
Именно поэтому изменения, внесённые через один указатель, затрагивают все остальные. Изменяете *p? Значение по этому адресу также изменится для q и r. Это прямой доступ к одним и тем же данным.
Почему это важно? Потому что это позволяет создавать алиасы (aliasing). Ваша программа может рассматривать одни и те же данные через разные «линзы». Один указатель может трактовать их как структуру (struct), а другой — как массив байтов. Данные при этом не меняются. Меняется их интерпретация.
Эта гибкость мощна. Но именно здесь скрываются ошибки. Если вы потеряете контроль над тем, куда указывает каждый указатель, вы можете случайно перезаписать данные, которые не планировали изменять. Но пока просто запомните: указатели — это просто адреса. А адреса можно разделять.




















