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

时间:2016-04-09 08:29:11

标签: c++ pointers dereference

这是一段困扰我的C ++代码。

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

? = nil

1 个答案:

答案 0 :(得分:0)

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是不恰当的。