Стандарт C99 (ISO / IEC 9899: 1999) описывает поведение:
§6.5.3.2 Операторы адреса и косвенности
Унарный оператор & возвращает адрес своегооперанд.Если операнд имеет тип '' type '', результат имеет тип '' указатель на тип ''.Если операнд является результатом унарного оператора *, ни этот оператор, ни оператор & не оцениваются, и результат, как если бы оба были опущены, за исключением того, что ограничения на операторы все еще применяются, и результат не является lvalue.
Это означает, что &*j
эквивалентно j
.
Однако, j
должен быть указателем на объект, и это только указатель на неполноеtype, как говорится в GCC 4.4.5.
§6.3.2.3 Указатели
Указатель на void может быть преобразован в указатель или из указателя на любой неполный или объектный тип.Указатель на любой неполный или тип объекта может быть преобразован в указатель на void и обратно;результат должен сравниваться равным исходному указателю.
Обратите внимание, что он различает тип объекта и неполный тип;это часто встречается в стандарте.
Итак, это наблюдение в вопросе неверно:
Оба из которых здесь тривиально удовлетворяются,
переменная j
не является указателем на объект;это указатель на неполный тип, который не является объектом.
§6.2.5 Типы
[...] Типы подразделяются на типы объектов (типы, которые полностью описывают объекты), типы функций (типы, которые описывают функции) и неполные типы (типы, которые описывают объекты, но не имеют информации, необходимой для определения их размеров).