“*&aPtr”和“&*aPtr”有什么不同?(涉及IT技术)

4
我想知道如果用 * & 和 & * 替换 * & aPtr 和 & * aPtr,它们之间有什么不同?
答:* &aPtr 和 & * aPtr 都是指针操作符,但它们的作用不同。* &aPtr 表示对指向指针的指针进行解引用操作,而 & *aPtr 则表示对指针所指向的地址进行取地址操作。
int a;   
int *aptr;  
a = 7;     
aptr=&a;

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

在这种特定情况下:没有。两者都等于aPtr - leemes
看起来是个简单的问题,但其中有些微妙之处。+1。 - Mark Ransom
3个回答

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

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

智能指针将覆盖 operator*。我甚至看到过 operator& 也被覆盖的情况。这一点非常重要。 - Mark Ransom
我认为它是正确的,除非我没有理解你的意思(我并不打算涵盖每个例子)。 - David Haim
1
这条评论不是针对你的,而是针对阅读你答案的其他人 - 是的,你已经表达了观点。如果你使用std::shared_ptr<int>代替int*,那么*&将产生对std::shared_ptr<int>的引用,而&*将产生int* - Mark Ransom
我忘记评论你的另一段才华了。你提到的未定义行为是真实存在的;现代编译器看到 &*i 后,可以假设 i 永远不会是空指针,并在优化时完全删除代码中的 if(i==nullptr) 测试。这种情况确实发生过。 - Mark Ransom

1
这些一元运算符 & 和 * 从右到左进行分组。
因此,在这个表达式中:
&*aPtr

首先使用运算符*,然后得到a的左值,然后应用&运算符,得到指向a的rvalue指针。其值与aPtr的初始值相同。但是你可能不会写例如


&*aPtr = &a;

当你写代码时

aPtr = &a;

在这个表达式中

*&aPtr

起初,应用运算符&,它会产生变量aPtr本身的地址。然后再应用运算符*,你又得到了aPtr
这个表达式与上面的表达式的区别在于,你可以写成:
*&aPtr = &a;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接