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

c pointers lvalue

52 просмотра

1 ответ

Например,

int x = 10;

Мы знаем, что идентификатор xдействует как метка, которая ссылается на объект, который хранит значение 10. Но почему нельзя &xтакже назвать метку, которая ссылается на тот же объект? &xэто адресное значение всего intобъекта, в котором хранится значение 10. Поэтому я думаю, что идентификатор xи &xнет разницы в роли в качестве метки объекта. Поэтому я считаю, что это дает веские основания говорить, что &xэто lvalue. Потому что в соответствии с ISO C11 6.3.2.1 говорится, что

lvalue - это выражение, которое потенциально обозначает объект.

Но почему значение указателя не &xявляется lvalue?

Автор: Jin Источник Размещён: 08.11.2019 11:27

Ответы (1)


1 плюс

Решение

Поскольку & x не является меткой, это указатель на помеченное значение.

Чтобы помочь вам понять, почему это важно, я собираюсь дать объяснение различных типов ссылок:

метки - также называемые «псевдонимами» или «именами», они идентифицируют некоторое значение или объект. на языке с динамической типизацией значение или объект, который они идентифицируют, могут измениться; в то время как в статически типизированном языке это остается тем же самым. Пример ссылки типа метки в C будетint x;

указатель - указатель идентифицирует адрес некоторого значения или объекта. это полезно для реализации псевдонимов (имеющих несколько ссылок на один и тот же объект). Пример ссылки типа указателя в C будет int *x;или&x

handle - дескриптор - это уникальный идентификатор (обычно целое число) для некоторого значения или объекта. как указатели, они допускают псевдонимы; но дескриптор не может быть разыменован как указатель. Это чрезвычайно полезно, поскольку его можно использовать, чтобы скрыть базовую реализацию структуры данных и позволить менеджеру памяти безопасно перестраивать память (например, дефрагментацию), чтобы улучшить когерентность кэша и повысить производительность. Примером ссылки на тип дескриптора в C может служить intзначение, возвращаемое openфункцией POSIX .

Не по теме: в Golang, когда вы пытаетесь присвоить члену объект типа указателя, он автоматически разыменовывается; так что нет необходимости в ->операторе. Ибо vec2 *v, v.xбудет интерпретироваться как v[0].x.

Автор: DeftlyHacked Размещён: 21.08.2016 03:52
Вопросы из категории :
32x32