* &关于C++中的指针

khbbv19g  于 2023-01-14  发布在  其他
关注(0)|答案(4)|浏览(226)

我目前正在修改C++考试的指针,遇到了一个我仍然不能理解的例子。
考虑以下(部分)代码:

int x = 17; 

int *ptr = &x; 

cout<<*&ptr<<" "<<&ptr<<" "<<ptr<<" "<<*ptr<<endl;

我知道&ptrptr是相同的,即打印变量x的地址。我还知道*ptr打印变量x内的值,即17。
但是第一个我看不懂,就是*&ptr,上面打印了一个地址,但是不知道指向哪个地址,我查过了,没有什么发现,*&组合代表什么?

mrwjdhj3

mrwjdhj31#

ptr&ptr相同。&ptrptr的地址(即,指向指针的指针)。
*是解引用操作符--它返回指针指向的值。因此,如果你解引用&ptr,你需要的是“ptr地址指向的值”,或者ptr(当然,它反过来是x的地址)。

9udxz4iz

9udxz4iz2#

*&ptr表达式中,*&的运算符优先级相同(但优先级是从右到左)。因此,它只获取ptr的地址(堆栈地址),然后解除对它的引用,基本上相当于ptr

tkqqtvp1

tkqqtvp13#

您有(幻想内存地址):

variable         value          address

 x                17             0x0001
 ptr == &x        0x0001         0x0002

*解引用一个指针。例如,*ptr使用ptr的值,即0x0001,并查看在该地址找到的值:17.
另一方面,&是运算符的地址,&xx的地址,它是0x0001x的地址是ptr
&*ptr就是ptr
我知道& ptr和ptr是一样的...
不,它们不是。ptrx0x0001)的地址。&ptrptr0x0002)的地址。

cclgggtu

cclgggtu4#

有一件事从其他答案中可能不那么清楚:在类似于*&ptr的表达式中,解引用算子*执行“address_of”算子&的逆运算,使得它们在组合时有效地抵消,并且结果是*&ptr等同于ptr
一个简单的思考方法是考虑将一个数减半(即除以2)和将其加倍(乘以2)的运算。取任意数x:如果你把它减半,然后把结果加倍,你会得到什么?你会得到x,当然,因为这两个操作抵消了,你从一个值开始,对它应用一个函数,然后应用它的反函数,所以你得到了原始值。
&*的工作方式相同:你有一个变量ptr和它的值,你用&获取变量的地址,然后*获取那个地址并给出存储在那里的值,也就是ptr的值。
这意味着*&ptrptr是相同的,您可以根据需要多次执行*&技巧:如果你写的是*&*&*&*&*&ptr,情况也是一样的,如果你想知道,所有这些操作符都是从右到左计算的,因为table of precedence and associativity就是这么说的(它们有相同的优先级2,当你有多个操作符有相同的优先级时,你可以按照结合性指定的顺序应用它们)。

相关问题