变量地址的C地址

时间:2012-04-02 12:38:51

标签: c pointers

获取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;

为什么两个运营商的功能不对称?

7 个答案:

答案 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)

简单地说,只有物理上保存在计算机内存中的东西才能有地址。只询问某事物的地址并不意味着地址存储在内存中。

当你有一个中间指针时,你现在将它存储在内存中,并获取存储位置的地址。