*& aPtr和& * aPtr之间有什么不同?

时间:2015-12-04 19:56:28

标签: c++ pointers

我想知道*&aPtr&*aPtr之间的差异,如果被替换为*&和& *?

int a;   
int *aptr;  
a = 7;     
aptr=&a;

cout << &* aPtr<< *&aPtr<< endl;

3 个答案:

答案 0 :(得分:7)

它们具有相同的值,但*&aPtr是引用aPtr的左值,而&*aPtr是与aPtr具有相同值的prvalue。

答案 1 :(得分:3)

如果类型是基元(整数,字符,布尔等),那么它们将产生相同的值。

如果特定类的运算符&*超载,则可能会出现差异。在这种情况下,根据实施情况而定 - 可能存在差异。

另一件事:如果T* t实际指向null,则可能发生转角情况:

int* i = nullptr;
*&i; //ok, first takes the address of i, then dereference it, yielding a null pointer again
&*i //wrong, dereference a null pointer, yielding undefined behavior

答案 2 :(得分:1)

这些一元运算符&amp;和*从右到左分组。

所以在这个表达式中

&*aPtr

首先应用了*运算符,在应用了运算符a之后,您获得了&的左值,并获得了指向a的rvalue值。 其值与aPtr的初始值相同。但是你可能不会写例如

&*aPtr = &a;

虽然你可以写

aPtr = &a;

在此表达式中

*&aPtr
首先应用

运算符&,生成变量aPtr本身的地址。之后,应用了*运算符,您再次获得aPtr

此表达式与上述表达式之间的区别在于您可以编写

*&aPtr = &a;

因为表达式*&amp; aPtr产生aPtr的左值。