繁体   English   中英

为什么指针地址的输出不同?

[英]why does output of an address of pointer is different?

我对程序退出感到困惑,请考虑我们有一个如下所示的类:

#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)

smc是指针smc的值,它是smc指向的地址。

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

&*smcsmc指向的地址(指向的是*smc ),因此它与smc相同。

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

smc是存在于堆中的实际对象的地址。
因此, &*smc取消引用该地址,然后再次引用该地址,获得相同的结果。 记住, *&就像是相反的运算符,例如加号和减号。 加上和减去相同的数量将获得相同的结果,就像取消引用和再次引用一样。

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

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

int* x = nullptr;

x值是多少? &x什么?

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

综上所述,可以说:

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

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

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

  • &*smc指向相同的地址smc (指针的“别名”的,即相同的smc

多一点解释。 因此,基本上smc是变量吗? (一个指针,但仍然是一个变量)。 因此&smc为您提供了此变量地址

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

同样, &*smc取消引用指针,并为您提供被取消引用对象的地址,该地址与上面的值相似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM