int main(int argc, char * argv[]) {
int a = 10;
int * sp = &a;
int * * dp1 = &sp;
int * * dp2 = &&a; // NG
int * * dp3 = &(&a); // NG
int * * dp4 = &((int *) &a); // NG
}
$ cc test.c
test.c: In function ‘main’:
test.c:6:17: error: lvalue required as unary ‘&’ operand
int * * dp3 = &(&a); // NG
^
test.c:7:17: error: lvalue required as unary ‘&’ operand
int * * dp4 = &((int *) &a); // NG
^
test.c:5:3: error: label ‘a’ used but not defined
int * * dp2 = &&a; // NG
^
答案 0 :(得分:7)
为什么我不能使用
&&a
因为&
为您提供了varibale的地址,而&a
不是变量。
C 11草案规定如下:
6.5.3.2地址和间接运营商
<强>约束强>
1一元&amp;的操作数运算符应该是函数指示符,[]或一元*运算符的结果,或者是一个左值,它指定一个不是位字段的对象,并且不用寄存器存储类说明符声明。
[...]
<强>语义强>
3一元&amp;运算符产生其操作数的地址。 [...]
绕过这个&#34;限制&#34;一个人可以使用像这样的复合文字引入临时存储(假设至少是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-Standard的扩展,允许在操作符标识标签时在单个操作符上使用&&
运算符。 (更多相关内容:https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html)
示例:
void * pv = &&lbl;
goto *pv;
/* some dead code */
lbl:;
/* living code again here */
答案 1 :(得分:5)
因为你只能获得一个变量的地址而不是一个值的地址(由&amp; a给出),而且&amp;&amp;是@UnWind所说的布尔值。
答案 2 :(得分:3)
在每个语句中,此部分:&a
被视为数字值(因为它获取变量的地址)。
所以,对于前两个错误:
错误:左值作为一元'&amp;'操作数
第一个&
被视为bitwise AND运算符,因此它希望在它之前有一个值。 (即2 & 3
)。
对于最后一个错误:
错误:标签'a'已使用但未定义
由于这两个&&
,因此它将a
视为标签(请参阅alk's answer)。
你想要实现的东西(得到一个地址的地址)是不可能的,因为无法得到一个&#34;常数值的地址&#34;,因为{{1 }}已经是一个值,但只是变量的地址。
答案 3 :(得分:2)
&var
为您提供变量的地址,因此我不知道您对&&var
的期望是什么,地址的地址?如果我错了,请纠正我。