繁体   English   中英

如何取消对临时指针的引用?

[英]How to dereference a temporary pointer to pointer?

这是一段令我感到困惑的C ++代码。

对于变量var,(int *)(&var)可以获取var的地址,而*(int *)(&var)可以获取var的值。 但是,如果有指向var的指针ptr,WHY *(int *)(&ptr)无法获得var的地址?

int var = 2;
cout << "var' address and value: " << &var << " " << var << endl;
cout << (int*)(&var) << endl;
cout << *(int*)(&var) << endl;
cout << (int*)*(int*)(&var) << endl;


int *ptr = &var;
cout << "ptr's address: " << &ptr << endl;
cout << (int*)(&ptr) << endl;
cout << *(int*)(&ptr) << endl;//NOT var's address, WHY?
cout << (int*)*(int*)(&ptr) << endl; //var's address,
cout << *(int*)*(int*)(&ptr) << endl; //var's value,

WhozCraig正在编写,只是因为您正在将指针转换为int 如果您在32位计算机上运行,​​这可能会很好地工作(因为指针完全位于8个字节上并且也位于int ),即使根本不建议这样做也是如此。 但是在64位计算机上则不会,因为指针( int*void* )使用8个字节,而int使用4个字节。

为了说明这一点,我使用的是64位计算机,当按发布方式运行您的程序时(使用int ),我得到:

var' address and value: 0x7ffd12c3dbd4 2
0x7ffd12c3dbd4
2
0x2
ptr's address: 0x7ffd12c3dbd8
0x7ffd12c3dbd8
314825684
0x12c3dbd4
Segmentation fault

当我将所有int替换为size_t (在我的计算机上为64位,而在32位计算机上为32位):

size_t var = 2;
cout << "var' address and value: " << &var << " " << var << endl;
cout << (size_t*)(&var) << endl;
cout << *(size_t*)(&var) << endl;
cout << (size_t*)*(size_t*)(&var) << endl;

size_t *ptr = &var;
cout << "ptr's address: " << &ptr << endl;
cout << (size_t*)(&ptr) << endl;
cout << *(size_t*)(&ptr) << endl;// var's address, OK
cout << (size_t*)*(size_t*)(&ptr) << endl; //var's address,
cout << *(size_t*)*(size_t*)(&ptr) << endl; //var's value, OK

我得到:

var' address and value: 0x7ffd5c258de0 2
0x7ffd5c258de0
2
0x2
ptr's address: 0x7ffd5c258de8
0x7ffd5c258de8
140726149418464
0x7ffd5c258de0
2

没有更多的分段错误, *(size_t*)(&ptr)报告140726149418464 ,它等于0x7ffd5c258de0

编辑:请参阅Marian Spanik评论,除size_t之外,可能还有其他合适的类型。 但是可以肯定的是, int是不合适的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM