为什么我不能使用&&a
因为&
给你一个变量的地址,而&a
不是一个变量。
C 11 草案规定了以下内容:
6.5.3.2 地址和间接运算符
约束
1 一元 & 运算符的操作数应为函数指示符、[] 或一元 * 运算符的结果,或指定不是位域且未使用寄存器存储类声明的对象的左值说明符。
[...]
语义
3 一元 & 运算符产生其操作数的地址。[...]
为了解决这个“限制”,可以使用这样的复合文字引入临时存储(至少假设 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 */