【发布时间】:2011-02-02 08:18:53
【问题描述】:
我编写了一些代码,用于理解指针的概念/基础:
int a=1;
int *b=&a;
int **c = &b;
int ***d = &c;
cout << &*(&*d) << endl;
为什么&*(&*d)返回“c”地址而不是“b”地址?
我也试过&*(&*(&*(&*(&*d))))之类的代码,但它保留了“c”的返回地址
【问题讨论】:
我编写了一些代码,用于理解指针的概念/基础:
int a=1;
int *b=&a;
int **c = &b;
int ***d = &c;
cout << &*(&*d) << endl;
为什么&*(&*d)返回“c”地址而不是“b”地址?
我也试过&*(&*(&*(&*(&*d))))之类的代码,但它保留了“c”的返回地址
【问题讨论】:
因为&* 相互抵消。 * 取消引用 d,它给出了 c 的值。然后&给出c的地址,或者d的值。
【讨论】:
& 和 * 相互抵消。如果你想取消引用一个指针,你只需要一个*。所以,试试**d。
【讨论】:
简单规则:使用*访问/提供值,使用&访问/提供地址。
【讨论】:
* 取消引用指针,并为您提供它指向的内容。
& 基本上是地址。
当它们在同一点使用时,它们相互抵消,&*d 相当于 d
如果要打印 c 的地址,则需要 *d,对于 b,您需要 **d,对于 a 中的数据,您需要 ***d。
【讨论】:
如果x 是一个变量,那么&*x 不完全等于x。前者是右值,后者是左值。另一方面,*&x 始终与 x 相同,因为这两个表达式都是左值。
【讨论】: