我想知道*&aPtr
和&*aPtr
之间的差异,如果被替换为*&和& *?
int a;
int *aptr;
a = 7;
aptr=&a;
cout << &* aPtr<< *&aPtr<< endl;
答案 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
的左值。