我很困惑,考虑到我们有一个如下课程:
#ifndef SOMECLASS
#define SOMECLASS
class SomeClass
{
public:
SomeClass();
SomeClass(int);
~SomeClass();
void foo(const int&);
}
#endif
Run Code Online (Sandbox Code Playgroud)
及其实施....
所以在主要功能:
int main(int argc, char **argv){
SomeClass* smc=new SomeClass();
cout<<smc<<"--"<<&smc<<"--"<<&*smc;
}
Run Code Online (Sandbox Code Playgroud)
我的输出如下:
0xf66210----0x7ffd622a34f0----0xf66210
Run Code Online (Sandbox Code Playgroud)
为什么smc和&smc和&*smc之间存在差异?请注意,smc和&*smc相等.
我正在使用ubuntu(14.04_x64)和+ cmake(2.18)+ gcc(4.8.4)
这里有两个变量:
1.指针,即堆栈分配
2.对象,即堆分配
smc是堆上存在的实际对象的地址.
因此,&*smc取消引用地址,然后再次引用它,然后得出相同的结果.记住,*并&像对运营商,像加号和减号.添加和减去相同的数量会产生相同的结果,就像再次引用和引用一样.
&smc 是指针变量的地址,它位于堆栈上.
如果您仍然不清楚,请考虑以下示例:
int* x = nullptr;
Run Code Online (Sandbox Code Playgroud)
什么是x价值?什么是&x?
现在?
x = new int(6)
x的新值是多少?它的地址是什么?