我目前正在修改C++考试的指针,遇到了一个我仍然不能理解的例子。
考虑以下(部分)代码:
int x = 17;
int *ptr = &x;
cout<<*&ptr<<" "<<&ptr<<" "<<ptr<<" "<<*ptr<<endl;
我知道&ptr
和ptr
是相同的,即打印变量x
的地址。我还知道*ptr
打印变量x
内的值,即17。
但是第一个我看不懂,就是*&ptr
,上面打印了一个地址,但是不知道指向哪个地址,我查过了,没有什么发现,*&
组合代表什么?
4条答案
按热度按时间mrwjdhj31#
ptr
和&ptr
不相同。&ptr
是ptr
的地址(即,指向指针的指针)。*
是解引用操作符--它返回指针指向的值。因此,如果你解引用&ptr
,你需要的是“ptr
地址指向的值”,或者ptr
(当然,它反过来是x
的地址)。9udxz4iz2#
在
*&ptr
表达式中,*
和&
的运算符优先级相同(但优先级是从右到左)。因此,它只获取ptr
的地址(堆栈地址),然后解除对它的引用,基本上相当于ptr
。tkqqtvp13#
您有(幻想内存地址):
*
解引用一个指针。例如,*ptr
使用ptr
的值,即0x0001
,并查看在该地址找到的值:17
.另一方面,
&
是运算符的地址,&x
是x
的地址,它是0x0001
,x
的地址是ptr
。&*ptr
就是ptr
。我知道& ptr和ptr是一样的...
不,它们不是。
ptr
是x
(0x0001
)的地址。&ptr
是ptr
(0x0002
)的地址。cclgggtu4#
有一件事从其他答案中可能不那么清楚:在类似于
*&ptr
的表达式中,解引用算子*
执行“address_of”算子&
的逆运算,使得它们在组合时有效地抵消,并且结果是*&ptr
等同于ptr
。一个简单的思考方法是考虑将一个数减半(即除以2)和将其加倍(乘以2)的运算。取任意数
x
:如果你把它减半,然后把结果加倍,你会得到什么?你会得到x
,当然,因为这两个操作抵消了,你从一个值开始,对它应用一个函数,然后应用它的反函数,所以你得到了原始值。&
和*
的工作方式相同:你有一个变量ptr
和它的值,你用&
获取变量的地址,然后*
获取那个地址并给出存储在那里的值,也就是ptr
的值。这意味着
*&ptr
与ptr
是相同的,您可以根据需要多次执行*&
技巧:如果你写的是*&*&*&*&*&ptr
,情况也是一样的,如果你想知道,所有这些操作符都是从右到左计算的,因为table of precedence and associativity就是这么说的(它们有相同的优先级2,当你有多个操作符有相同的优先级时,你可以按照结合性指定的顺序应用它们)。