Ссылка / разыменование - PullRequest
1 голос
/ 06 марта 2012

Когда x является L-значением (скажем, переменная), то имеет место следующее тождество:

x == * (& x)

Это довольно легко объяснить, потому что & x является указателем на x и оператор разыменования *, примененный к & x, тогда, конечно, вернет x.

Теперь мне интересно, имеет ли смысл обратное. Если быть точным, мне интересно, если

p == & (* p)

, когда p - неискаженный указатель. Кажется, это имеет смысл, потому что * p само по себе является L-значением (значением, имеющим адрес), потому что у нас уже есть указатель (= адрес) p на него. Так что вам нужно только знать, что такие указатели уникальны, потому что тогда & (* p) не имеет другого шанса стать p.

Так что, когда обе идентичности истинны, вы можете сказать, что математически * и & являются обратными функциями друг от друга.

Я прав? Существуют ли возможные исключения из этих предполагаемых правил?

1 Ответ

3 голосов
/ 06 марта 2012

Когда p является указателем объекта, &*p эквивалентно p.Оценка *p не происходит, и это гарантируется стандартом C.

char *q, *p = NULL;
q = &*p;  // equivalent to q = p;

Вот соответствующий параграф стандарта:

(C99, 6.5.3.2p3) "Если операнд является результатом унарного оператора *, ни этот оператор, ни оператор & не оцениваются, и результат такой, как если бы оба опущены, за исключением того, что ограничения на операторы все еще применяются, а результат неlvalue. "

EDIT : После комментария @ ldav1s я изменил слово pointer на указатель объекта .Действительно, если p имеет тип void *, то &*p недопустим.Для информации, это обсуждалось Комитетом C в отчете о дефектах № 102: http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / dr_012.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...