变量地址的C地址

bph*_*bph 8 c pointers

获取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
Run Code Online (Sandbox Code Playgroud)

但你可以做反过来,例如

b = **ptr_ptr_a;     <- no intermediate variable required
Run Code Online (Sandbox Code Playgroud)

例如,我不必这样做:

ptr_b = *ptr_ptr_b;
b = *ptr_b;
Run Code Online (Sandbox Code Playgroud)

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

Fré*_*idi 12

address-of运算符返回一个rvalue,你不能获取rvalue的地址(有关rvalues和lvalues之间差异的解释,请参见此处).

因此,您必须通过将其存储在变量中将其转换为左值,然后您可以获取该变量的地址.

  • 嗯,这是准确的,但如果OP问这个问题,那么RValues可能是一个非常先进的概念...... (2认同)

sta*_*ker 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
Run Code Online (Sandbox Code Playgroud)

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