变量地址的C地址

kmbjn2e3  于 2023-01-20  发布在  其他
关注(0)|答案(7)|浏览(220)

在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;

为甚么两个营办商的功能不对称呢?

yjghlzjz

yjghlzjz1#

address-of运算符返回一个右值,并且不能获取右值的地址(有关右值和左值之间区别的说明,请参见here)。
因此,你必须把它转换成一个左值,方法是把它存储在一个变量中,然后你就可以得到那个变量的地址了。

holgip5t

holgip5t2#

用下面这样的内存布局示例可能更容易解释:

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_a == ptr_a,  **ptr_ptr_a == 1

但是变量a有一个地址(1000),如果不是指针的地址,地址的地址是什么意思?&a是一个终点站,因此&&a没有任何意义。

0pizxfdo

0pizxfdo3#

当你用“&”询问一个地址时,你询问的是存储在内存中的东西的地址。用“&”两次意味着你想得到一个没有意义的地址的地址。
顺便说一下,如果你使用中间变量,你会得到中间变量的地址。这意味着如果你使用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");
xienkqul

xienkqul4#

某物的地址的地址是不可能的,因为地址的地址是不明确的
您可以获取某个东西的地址,它包含某个东西的地址,并且您可以多次出现该地址(具有不同的值)

2ic8powd

2ic8powd5#

没有地址的地址这样的东西,你有一个盒子,上面有一个数字,这是盒子在记忆序列中的数字,没有地方存储这些数字,这也是非常递归的,正如你所看到的。

w9apscun

w9apscun6#

如果你想一想,你会注意到,为了得到某个东西的地址,它必须在内存中。
如果你有一个变量

int a

它有一个地址,但是这个地址,如果有疑问的话,在内存中是找不到的,所以它不需要地址,你只能得到一个变量的地址。
在另一个方向上,事情就简单多了。如果你有某个东西的地址,你可以解引用它。如果这个“某个东西”是一个指针,你可以再次解引用它。所以上面提到的双重间接引用是自动给出的。

aor9mmx1

aor9mmx17#

简单地说,只有物理上存在计算机内存中的东西才能有地址,仅仅询问某个东西的地址并不意味着该地址就被存储在内存中。
当你有一个中间指针时,你现在把它存储在内存中,并获取它存储的地址。

相关问题