我对一个程序感到困惑 考虑我们有一个类如下:
#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)
答案 0 :(得分:7)
smc
是指针smc
的值,它是smc
指向的地址。
&smc
是指针smc
本身的地址。
&*smc
是smc
所指向的地址(指向的是*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
相同)
答案 3 :(得分:1)
多一点解释。
所以基本上smc
是一个变量吧? (一个指针,但仍然是一个变量)。
因此&smc
会为您提供此变量的地址。
现在,如果您尝试打印smc
的值,您应该得到什么?变量的值对吗?由于这是一个指针,在这种情况下,此变量的值是它指向的另一个对象的地址。
类似地&*smc
- 取消引用指针,并为您提供取消引用的对象的后退地址,与上述值类似。