Why can't I use &&a
Поскольку &
дает адрес varibale и &a
не является переменной.
: C 11 Проект определяет следующее:
6.5.3.2 Address and indirection operators
Constraints
1 The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.
[...]
Semantics
3 The unary & operator yields the address of its operand. [...]
Чтобы обойти это «ограничение» можно было бы ввести временное хранение с использованием соединения буквального, как это (предполагая, что C99 по крайней мере):
int a = 42;
int ** ppa = &((int *){&a});
в качестве примечания со ссылкой на сообщение об ошибке ниже:
test.c:5:3: error: label ‘a’ used but not defined
int * * dp2 = &&a; // NG
^
gcc (и, возможно, другие) определяют расширение C-стандарта, позволяющее использовать оператор &&
на одном операнте, если операнд идентифицирует метку. (Подробнее об этом здесь: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html)
Пример:
void * pv = &&lbl;
goto *pv;
/* some dead code */
lbl:;
/* living code again here */
Главным образом, потому что '& a' возвращает немедленное * значение *. Вид, вроде: 'a = &123;' дает ту же ошибку. Вы заинтересованы в том, как и как в спецификации, или вы (думаете, что вам) нужна эта информация для чего-то? – usr2564301