![](/img/trans.png)
[英]C++: Why does my function return a reference address different from the dereferenced pointer's address?
[英]why does output of an address of pointer is different?
我对程序退出感到困惑,请考虑我们有一个如下所示的类:
#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和&smc和&* smc之间有区别? 请注意,smc和&* smc相等。
我正在使用ubuntu(14.04_x64)和+ cmake(2.18)+ gcc(4.8.4)
smc
是指针smc
的值,它是smc
指向的地址。
&smc
是指针smc
本身的地址。
&*smc
是smc
指向的地址(指向的是*smc
),因此它与smc
相同。
这里有两个变量:
1.指针,它是堆栈分配的
2.对象,这是堆分配的
smc
是存在于堆中的实际对象的地址。
因此, &*smc
取消引用该地址,然后再次引用该地址,获得相同的结果。 记住, *
和&
就像是相反的运算符,例如加号和减号。 加上和减去相同的数量将获得相同的结果,就像取消引用和再次引用一样。
&smc
是指针变量的地址,它位于堆栈上。
如果您仍然不清楚,请考虑以下示例:
int* x = nullptr;
x
值是多少? &x
什么?
现在?
x = new int(6)
x的新值是多少? 那是什么地址?
综上所述,可以说:
smc
显示存储在指针中的地址(使用new
动态分配的( 堆 )内存的地址)
&smc
显示指针本身的地址
*smc
显示地址的内容(访问class SomeClass
的对象的成员)
&*smc
指向相同的地址smc
(指针的“别名”的,即相同的smc
)
多一点解释。 因此,基本上smc
是变量吗? (一个指针,但仍然是一个变量)。 因此&smc
为您提供了此变量的地址 。
现在,如果您尝试仅打印smc
值,您应该得到什么? 变量的值正确吗? 由于这是一个指针,因此在这种情况下,此变量的值是它指向的另一个对象的地址。
同样, &*smc
取消引用指针,并为您提供被取消引用对象的地址,该地址与上面的值相似。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.