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

时间:2015-09-06 15:06:55

标签: c++ pointers

我对一个程序感到困惑 考虑我们有一个类如下:

#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和&amp; smc和&amp; * smc之间存在差异? 请注意,smc和&amp; * smc相等。

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

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:5)

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

smc是实际对象的地址,它存在于堆上 因此,&*smc取消引用地址,然后再次引用它,然后得出相同的结果。请记住,*&就像对面的运算符,如加号和减号。添加和减去相同的数量会产生相同的结果,就像重新引用和再次引用一样。

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

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

int* x = nullptr;

什么是x值?什么是&x

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

答案 2 :(得分:1)

总结以上内容,可以说:

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

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

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

  • &*smc指向与smc相同的地址(指针的“alias”,即与smc相同)

    < / LI>

答案 3 :(得分:1)

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

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

类似地&*smc - 取消引用指针,并为您提供取消引用的对象的后退地址,与上述值类似。