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