获取C中地址的唯一方法(与双引用相反,有一个中间变量?
e.g。我有:
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
e.g。我不必这样做:
ptr_b = *ptr_ptr_b;
b = *ptr_b;
为什么两个运营商的功能不对称?
答案 0 :(得分:12)
address-of运算符返回一个rvalue,你不能获取rvalue的地址(有关rvalues和lvalues之间差异的解释,请参阅here)。
因此,您必须通过将其存储在变量中将其转换为左值,然后您可以获取该变量的地址。
答案 1 :(得分:5)
使用这样的示例内存布局解释可能更容易:
Var Adr value
---------------------
a 1000 1
ptr_a 1004 1000
ptr_ptr_a 1008 1004
1008 1004 1008->1004->1000
You can obviously dereference ptr_ptr_a twice *ptr_ptr == ptr_a, **ptr_ptr_a == 1
但是变量a
有一个地址(1000)如果它不是指针的地址,那么地址的地址是什么意思? &a
是最后一站。因此&&a
没有任何意义。
答案 2 :(得分:4)
当您使用'&amp;'询问地址时,您会询问地址中存储的内容。 使用'&amp;' 2次意味着你想得到一个没有意义的地址。
顺便说一句,如果您在使用中间变量时,将获得中间变量的地址。这意味着如果您使用2个中间变量来比较地址,它们将是不同的。 例如:
int a = 0;
int* p = &a;
int* q = &a;
// for now &p and &q are different
if (&p == &q)
printf("Anormal situation");
else
print("Ok");
答案 3 :(得分:1)
某地址不可能,因为地址不明确
您可以获取包含某些内容的地址,并且您可能会有多次出现(使用不同的值)
答案 4 :(得分:1)
没有地址的地址。你有一个盒子,上面有一个数字。这是内存序列中框的编号。没有存储这些数字的地方。如你所见,这也是非常递归的。
答案 5 :(得分:1)
如果你想一会儿,你会注意到为了获得某些东西的地址,它必须在记忆中。
如果您有变量
int a
它有一个地址。但是,如果有疑问,这个地址就没有内存,所以它不需要有地址。 IOW,你只能得到一个变量的地址。
在另一个方向,事情变得更容易。如果你有某些地址,你可以取消引用它。如果这个“东西”是一个指针,你可以再次取消引用它。因此,上面提到的双重间接是自动给出的。
答案 6 :(得分:1)
简单地说,只有物理上保存在计算机内存中的东西才能有地址。只询问某事物的地址并不意味着地址存储在内存中。
当你有一个中间指针时,你现在将它存储在内存中,并获取存储位置的地址。