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

C++ 为什么指针地址的输出不同?,c++,pointers,C++,Pointers,我对自己的计划感到困惑 考虑一下我们有一个类如下: #ifndef SOMECLASS #define SOMECLASS class SomeClass { public: SomeClass(); SomeClass(int); ~SomeClass(); void foo(const int&); } #endif 0xf66210----0x7ffd622a34f0----0xf66210 及其实施 因此

我对自己的计划感到困惑 考虑一下我们有一个类如下:

#ifndef SOMECLASS
#define SOMECLASS
class SomeClass
{
    public:
        SomeClass();
        SomeClass(int);
        ~SomeClass();
        void foo(const int&);
}
#endif
0xf66210----0x7ffd622a34f0----0xf66210
及其实施

因此,在主要功能方面:

int main(int argc, char **argv){
    SomeClass* smc=new SomeClass();
    cout<<smc<<"--"<<&smc<<"--"<<&*smc; 
}
为什么smc和&smc以及&smc之间存在差异? 请注意,smc和&*smc是相等的


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

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

&smc
是指针
smc
本身的地址


&*smc
smc
所指向的地址(被指向的是
*smc
),因此它与
smc
相同
smc
是指针
smc
的值,它是
smc
所指向的地址

&smc
是指针
smc
本身的地址


&*smc
smc
指向的地址(指向的是
*smc
),因此它与
smc
相同,这里有两个变量:
1.堆栈分配的指针
2.堆分配的对象

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

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

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

int* x = nullptr;
什么是
x
值?什么是
&x

现在呢?
x=newint(6)


x的新值是多少?它的地址是什么

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

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

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

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

int* x = nullptr;
什么是
x
值?什么是
&x

现在呢?
x=newint(6)


x的新值是多少?它的地址是什么

综上所述,可以说:

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

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

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

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


综上所述,可以说:

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

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

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

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


    • 再解释一下。 所以基本上smc是一个变量,对吗?(指针,但仍然是变量)。 因此,
      &smc
      为您提供此变量的地址

      现在,如果您试图打印smc的值,您应该得到什么?变量的值对吗?因为这是一个指针,所以在这种情况下,这个变量的值是它指向的另一个对象的地址


      类似地,
      &*smc
      -取消对指针的引用,并给出被取消引用对象的回地址,这与上面的值类似。

      稍微解释一下。 所以基本上smc是一个变量,对吗?(指针,但仍然是变量)。 因此,
      &smc
      为您提供此变量的地址

      现在,如果您试图打印smc的值,您应该得到什么?变量的值对吗?因为这是一个指针,所以在这种情况下,这个变量的值是它指向的另一个对象的地址


      类似地,
      &*smc
      -取消对指针的引用,并给出被取消引用对象的返回地址,该地址与上述值类似。

      为什么希望对象的地址等于指向该对象的指针的地址?对象和指向它的指针是不同的对象,它们有不同的地址吗?为什么希望对象的地址等于指向该对象的指针的地址?对象和指向它的指针是不同的对象,它们有不同的地址吗?好的解释……但是为什么C++中的SMC和*SMC是一样的?!smc->foo();和*smc->foo()@梅赫迪:它们不一样。有了打印功能的地址可能会不同,我认为这甚至不可能,请在这里检查:好的解释……但是为什么C++中的SMC和*SMC是一样的?smc->foo();和*smc->foo()@梅赫迪:它们不一样。由于打印功能地址可能不同,我认为这甚至不可能,请检查这里:smc和*smc是否相同?是否执行*smc->foo();和smc->foo()