C 为什么不是';难道不可能用双符号和来寻址指针吗?
根据第6.5.3.2章,C 为什么不是';难道不可能用双符号和来寻址指针吗?,c,pointers,C,Pointers,根据第6.5.3.2章,C11标准,一元&运算符 一元&运算符的操作数应为函数指示符、[]或一元*运算符的结果,或为指定非位字段且未使用寄存器存储类说明符声明的对象的左值 但是, 一元&运算符生成其操作数的地址。[…]结果不是左值 这不是一个左值。因此,代码中访问&&i)的方式无效。这就是为什么我们需要使用中间指针变量,它可以用作左值(作为一元&的操作数提供) 注:main()的正确签名为int main(void)根据第6.5.3.2章,C11标准,一元&运算符 一元&运算符的操作数应为函数指
C11
标准,一元&
运算符
一元&
运算符的操作数应为函数指示符、[]或一元*
运算符的结果,或为指定非位字段且未使用寄存器存储类说明符声明的对象的左值
但是,
一元&
运算符生成其操作数的地址。[…]结果不是左值
这不是一个左值。因此,代码中访问&&i)
的方式无效。这就是为什么我们需要使用中间指针变量,它可以用作左值(作为一元&
的操作数提供)
注:
main()
的正确签名为int main(void)
根据第6.5.3.2章,C11
标准,一元&
运算符
一元&
运算符的操作数应为函数指示符、[]或一元*
运算符的结果,或为指定非位字段且未使用寄存器存储类说明符声明的对象的左值
但是,
一元&
运算符生成其操作数的地址。[…]结果不是左值
这不是一个左值。因此,代码中访问&&i)
的方式无效。这就是为什么我们需要使用中间指针变量,它可以用作左值(作为一元&
的操作数提供)
注意:
main()
的正确签名是int main(void)
这与您无法获取例如整数文本的地址的原因相同,它不是存储在任何地方的内容
变量(例如
k
)存储在内存中,这就是为什么可以使用&k
获取k
的地址,而k
实际上是指向k
的指针。k
本身是一个指针并不重要。同样的原因是,你不能得到一个整数文本的地址,它不是存储在任何地方的东西
变量(例如k
)存储在内存中,这就是为什么可以使用&k
获取k
的地址,而k
实际上是指向k
的指针。k
本身是指针并不重要。**(&(&i))
不等于**k
。因为&i
会给出i
的地址,比如0x12345
。现在再次对其应用&
是无效的,因为&
要求将左值作为操作数,但0x12345
是右值
*(&(*(&i))
等同于**k
**(&(&i))
不等于**k
。因为&i
会给出i
的地址,比如0x12345
。现在再次对其应用&
是无效的,因为&
要求将左值作为操作数,但0x12345
是右值
*(&(*(&i))
相当于**k
表达式&(&i)
要求i
的地址;这样的手术是荒谬的。地址没有地址
表达式&i
的结果不是左值;它不会占用任何内存,因此您可以对其进行写入或获取其地址 表达式&(&i)
要求的是i
的地址;这样的手术是荒谬的。地址没有地址
表达式&i
的结果不是左值;它不会占用任何内存,因此您可以对其进行写入或获取其地址
int main()
{
int i=10,*j,**k,***l;
j=&i;
k=&j;
l=&k;
printf("%d",**(&(&i)));
/* isn't it the same as **k ,
because k=&j and j=&i */
return 0;
}