这是一段困扰我的C ++代码。
对于变量var,(int *)(& var)可以获取var的地址,而*(int *)(& var)可以获得var的值。但是,如果指针ptr指向var,WHY *(int *)(& ptr)不能得到var的地址???
? = nil
答案 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
是不恰当的。