在C语言中获取地址的唯一方法是什么(与双重解引用相反,它需要一个中间变量?)
例如,我有:
int a;
int b;
int *ptr_a;
int *ptr_b;
int **ptr_ptr_a;
a = 1;
ptr_a = &a;
ptr_ptr_a = &(&a); <- compiler says no
ptr_ptr_a = &&a; <- still compiler says no
ptr__ptr_a = &ptr_a; <- ok but needs intermediate variable
但你也可以做相反的事。
b = **ptr_ptr_a; <- no intermediate variable required
例如,我不必做:
ptr_b = *ptr_ptr_b;
b = *ptr_b;
为甚么两个营办商的功能不对称呢?
7条答案
按热度按时间yjghlzjz1#
address-of运算符返回一个右值,并且不能获取右值的地址(有关右值和左值之间区别的说明,请参见here)。
因此,你必须把它转换成一个左值,方法是把它存储在一个变量中,然后你就可以得到那个变量的地址了。
holgip5t2#
用下面这样的内存布局示例可能更容易解释:
但是变量
a
有一个地址(1000),如果不是指针的地址,地址的地址是什么意思?&a
是一个终点站,因此&&a
没有任何意义。0pizxfdo3#
当你用“&”询问一个地址时,你询问的是存储在内存中的东西的地址。用“&”两次意味着你想得到一个没有意义的地址的地址。
顺便说一下,如果你使用中间变量,你会得到中间变量的地址。这意味着如果你使用2个中间变量来比较地址,它们将是不同的。例如:
xienkqul4#
某物的地址的地址是不可能的,因为地址的地址是不明确的
您可以获取某个东西的地址,它包含某个东西的地址,并且您可以多次出现该地址(具有不同的值)
2ic8powd5#
没有地址的地址这样的东西,你有一个盒子,上面有一个数字,这是盒子在记忆序列中的数字,没有地方存储这些数字,这也是非常递归的,正如你所看到的。
w9apscun6#
如果你想一想,你会注意到,为了得到某个东西的地址,它必须在内存中。
如果你有一个变量
它有一个地址,但是这个地址,如果有疑问的话,在内存中是找不到的,所以它不需要地址,你只能得到一个变量的地址。
在另一个方向上,事情就简单多了。如果你有某个东西的地址,你可以解引用它。如果这个“某个东西”是一个指针,你可以再次解引用它。所以上面提到的双重间接引用是自动给出的。
aor9mmx17#
简单地说,只有物理上存在计算机内存中的东西才能有地址,仅仅询问某个东西的地址并不意味着该地址就被存储在内存中。
当你有一个中间指针时,你现在把它存储在内存中,并获取它存储的地址。