【问题标题】:why does output of an address of pointer is different?为什么指针地址的输出不同?
【发布时间】:2015-09-06 15:06:55
【问题描述】:

我对退出程序感到困惑 考虑我们有一个像下面这样的类:

#ifndef SOMECLASS
#define SOMECLASS
class SomeClass
{
    public:
        SomeClass();
        SomeClass(int);
        ~SomeClass();
        void foo(const int&);
}
#endif

及其实现....

所以在主函数中:

int main(int argc, char **argv){
    SomeClass* smc=new SomeClass();
    cout<<smc<<"--"<<&smc<<"--"<<&*smc; 
}

我的输出如下:

0xf66210----0x7ffd622a34f0----0xf66210

为什么smc和&smc和&*smc有区别? 注意 smc 和 &*smc 是相等的。

我正在使用 ubuntu(14.04_x64) 和+cmake(2.18)+gcc(4.8.4)

【问题讨论】:

  • 为什么你希望一个对象的地址等于指向这个对象的指针的地址?对象和指向它的指针是不同的对象,它们有不同的地址吗?

标签: c++ pointers


【解决方案1】:

smc是指针smc的值,也就是smc所指向的地址。

&amp;smc 是指针smc 本身的地址。

&amp;*smcsmc指向的地址(被指向的是*smc),所以和smc一样。

【讨论】:

  • smc 和 *smc 一样吗? *smc->foo();和 smc->foo() 有什么区别?
  • smc*smc 不一样,smc 是指针,*smc 是指针指向的对象(SomeClass 的实例)。 smc-&gt;foo() 表示调用该实例的成员函数foo(),根据您的代码,*smc-&gt;foo() 是非法的。最好阅读a book on C++
【解决方案2】:

这里有两个变量:
1. 堆栈分配的指针
2. 堆分配的对象

smc是实际对象的地址,存在于堆上。
因此,&amp;*smc 取消引用该地址,然后再次引用它,发出相同的结果。请记住,*&amp; 就像相反的运算符,就像加号和减号一样。相同数量的加减得到相同的结果,就像取消引用和再次引用一样。

&amp;smc 是指针变量的地址,它位于堆栈上。

如果您仍然不清楚,请考虑以下示例:

int* x = nullptr;

x 的价值是什么?什么是&amp;x

现在呢?
x = new int(6)
x 的新值是多少?它的地址是什么?

【讨论】:

  • 好的,smc 和 *smc 一样吗? *smc->foo();和 smc->foo() 有什么区别?
  • +1 用于 nullptr 示例。 @mehdi 他们不一样。事实上 (*smc)->foo() 会导致错误,因为您将 operator -> 应用于非指针类型。如果您要问 (*smc).foo() 和 smc->foo() 是否相同,那么是的,它们是相同的。 operator-> 取消引用指针并访问成员 foo。这也可以通过取消引用(使用 *)和通过“.”访问成员来实现。
  • 关于您的问题的最后说明 * smc->foo() 在这里无效,因为 operator-> 优先于 operator *,因此该语句将隐式取消引用 smc,访问并执行 foo() 成员,并取消引用其结果。因此,您必须使用括号: ( * smc)->foo()
【解决方案3】:

多一点解释。 所以基本上smc 是一个变量,对吧? (一个指针,但仍然是一个变量)。 所以&amp;smc 给你这个变量的地址

现在,如果您尝试仅打印 smc 的值,您应该得到什么?变量的值对吗?由于这是一个指针,在这种情况下,这个变量的值是它指向的另一个对象的地址。

类似&amp;*smc - 解引用指针并为您提供解引用对象的返回地址,与上述值类似。

【讨论】:

  • 好的解释...但是为什么在 c++ smc 和 *smc 中是一样的?! smc->foo();和 *smc->foo();
  • @mehdi:它们不一样。与打印功能地址可能不同,我认为这是不可能的,请查看:stackoverflow.com/questions/11111969/…
【解决方案4】:

综上所述,可以说:

  • smc显示存储在指针中的地址(使用new动态分配()内存的地址)

  • &amp;smc显示指针本身的地址

  • *smc显示地址的内容(访问对象的成员-class SomeClass

  • &amp;*smc指向与smc相同的地址(指针的"alias",即与smc相同)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多