为什么我不能在C中使用`&& a`?

时间:2015-06-18 09:48:39

标签: c pointers operators address-operator

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
   ^

4 个答案:

答案 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的期望是什么,地址的地址?如果我错了,请纠正我。