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

Why can't I use `&&a` in C?

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
   ^

&var 给你变量的地址,所以我不知道你期望 &&var 是什么,地址的地址?如果我错了请纠正我。

因为你只能得到一个变量的地址而不是一个值的地址(由 &a 给出)而且 && 是 boolean AND 正如@UnWind 所说。

Why can't I use &&a

因为 & 给你一个变量的地址而 &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. [...]

为了解决这个问题 "limitation" 可以使用这样的复合文字引入临时存储(至少假设 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被视为数字值(因为它获取变量的地址)。

因此,对于前两个错误:

error: lvalue required as unary ‘&’ operand

第一个 & 被视为 bitwise AND 运算符,因此它希望在它之前有一个值。 (即 2 & 3)。

最后一个错误:

error: label ‘a’ used but not defined

是因为有两个&&所以把a当作一个标签(见)。

想要实现的事情(获取地址的地址)是不可能的,因为无法获取"constant value"的地址,因为&a已经是一个值,只是变量的地址。