[英]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.