Почему значение указателя не может быть хорошей меткой для ссылки на объект в памяти?
Например,
int x = 10;
Мы знаем этот идентификатор x
действует как метка, которая ссылается на объект, который хранит значение 10
, Но почему не могу &x
также называться меткой, которая ссылается на тот же объект? &x
это значение адреса целого int
объект, который хранит значение 10
, Так что я думаю, идентификатор x
а также &x
не имеет никакой разницы в роли метки объекта. Поэтому я считаю, что это дает веские основания говорить, что &x
является lvalue
, Потому что в соответствии с ISO C11 6.3.2.1 говорится, что
lvalue - это выражение, которое потенциально обозначает объект.
Но почему значение указателя не &x
lvalue
?
1 ответ
Поскольку &x не является меткой, это указатель на помеченное значение.
Чтобы помочь вам понять, почему это важно, я собираюсь дать объяснение различных типов ссылок:
метки - также называемые "псевдонимами" или "именами", они идентифицируют некоторое значение или объект. на языке с динамической типизацией значение или объект, который они идентифицируют, могут измениться; в то время как в статически типизированном языке это остается тем же самым. Пример ссылки типа метки в C будет int x;
указатель - указатель идентифицирует адрес некоторого значения или объекта. это полезно для реализации псевдонимов (имеющих несколько ссылок на один и тот же объект). Пример ссылки типа указателя в C будет int *x;
или же &x
handle - дескриптор - это уникальный идентификатор (обычно целое число) для некоторого значения или объекта. как указатели, они допускают псевдонимы; но дескриптор не может быть разыменован как указатель. Это чрезвычайно полезно, потому что его можно использовать, чтобы скрыть базовую реализацию структуры данных и позволить менеджеру памяти безопасно перестраивать память (например, дефрагментацию), чтобы улучшить когерентность кэша и повысить производительность. Примером ссылки на тип ручки в C будет int
значение, возвращаемое POSIX open
функция.
Не по теме: в Golang, когда вы пытаетесь присвоить члену объект типа указателя, он автоматически разыменовывается; так что нет необходимости ->
оператор. За vec2 *v
, v.x
будет интерпретироваться как v[0].x
,