Почему значение указателя не может быть хорошей меткой для ссылки на объект в памяти?

Например,

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,

Другие вопросы по тегам