簡體   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