简体   繁体   English

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

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

Here is a piece of C++ code that confuses me. 这是一段令我感到困惑的C ++代码。

For a variable var, (int*)(&var) can get var's address and *(int*)(&var) can get var's value. 对于变量var,(int *)(&var)可以获取var的地址,而*(int *)(&var)可以获取var的值。 However, if there is a pointer ptr point to var, WHY *(int*)(&ptr) cannot get var's address??? 但是,如果有指向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 is write, it's just because you are casting a pointer to a int . WhozCraig正在编写,只是因为您正在将指针转换为int If you are running on a 32bits machine, this may work fine (because pointers are on 8 bytes and int too), even if not recommended at all. 如果您在32位计算机上运行,​​这可能会很好地工作(因为指针完全位于8个字节上并且也位于int ),即使根本不建议这样做也是如此。 But on 64bits machine it won't, as pointers ( int* , void* ) use 8 bytes, while int uses 4 bytes. 但是在64位计算机上则不会,因为指针( int*void* )使用8个字节,而int使用4个字节。

To illustrate, I'm using a 64bits machine, When I run your program as posted (using int ), I get: 为了说明这一点,我使用的是64位计算机,当按发布方式运行您的程序时(使用int ),我得到:

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

When I replace all int by size_t (which is 64bits on my machine, and will be 32bits on a 32bits machine): 当我将所有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

I get: 我得到:

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

No more segmentation fault, and *(size_t*)(&ptr) reports 140726149418464 which is equal to 0x7ffd5c258de0 . 没有更多的分段错误, *(size_t*)(&ptr)报告140726149418464 ,它等于0x7ffd5c258de0

Edit: See Marian Spanik comment, there may be other appropriate types than size_t . 编辑:请参阅Marian Spanik评论,除size_t之外,可能还有其他合适的类型。 But what's sure, is that int is not appropriate. 但是可以肯定的是, int是不合适的。

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

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