拿这段代码:
int a;
int *pointer = &a;
int **b = &(&(*pointer));
Run Code Online (Sandbox Code Playgroud)
以上是否设置b为地址pointer?
我问的原因是因为*pointer给出了它的值a,并且它的引用是地址a.这被视为仅仅是地址a,还是被视为pointer.
这有意义吗?我可以这样做:
&(*pointer) = a;
Run Code Online (Sandbox Code Playgroud)
在C中,您只能获得指向存储区域的指针(这意味着变量,数组元素或其他指针;它们称为"l值"),而不是任何表达式.您无法获得指向没有定义存储区域的表达式的指针(如添加或函数调用的结果).但应该注意的是,C++会将这些规则与参考文献混淆,但为了清楚起见,我将其排除在外.
指针不是神奇的:最后,它们只是整数.因此,当你得到指针的指针时,它就像你得到一个整数的指针.它没有更多的反响.
例如,如果你a在代码中得到指针,那么你只是将这个地址复制到另一个变量中.没有什么可以阻止你改变所述变量:
int a;
int* p = &a;
p = NULL;
Run Code Online (Sandbox Code Playgroud)
这样做,你a将保持不变.所有你可以改变的a是它的价值.它的地址是不可变的.任何其他东西都意味着&a = NULL(或任何其他指针值)将起作用,但事实并非如此.