[英]Why do I get the same value with and without dereferencing a pointer
如下代碼:
int number = 65;
char *ptr = reinterpret_cast< char* >(&number);
cout << *ptr << endl;
*ptr
打印A
而ptr
打印A
為什么它們都打印相同的結果?
流正在重載<<
,因此無論如何都要對char
隱式完成解引用。
更具體地說:由於char *
是C的string
,所以ostream
嘗試按原樣讀取它,即,它取消引用指針並讀取char
s,直到找到零字節為止。 (這僅適用於正確的字節序 。)
考慮以下代碼:
#include <iostream>
int main(void) {
char c = 'A';
int i = 66;
std::cout << c << '\n';
std::cout << &c << '\n';
std::cout << i << '\n';
std::cout << &i << '\n';
return 0;
}
在我的機器( 不是全部! )上打印
A
AB
66
0x7fff0d1db1bc
因為c
可以正確打印,但是&c
被解釋為字符串。 但是c
不是以空值結尾的,因此ostream
繼續讀取,找到i
的第一個字節,然后找到一個空字節,因為i
的值太小,我們僅使用其四個字節之一。
但是, i
和&i
按預期方式打印。 此行為僅針對char
實現,因為它對其他類型沒有意義。
兩者都打印相同的結果,因為:
ostream::operator<<
具有char*
和char
的重載(請參見此處和此處 )。 char*
重載將參數解釋為指向以null結尾的字節字符串的指針,而不是指向單個char
的指針。 sizeof(char) < sizeof(int)
(與==相反)。 這意味着,由number
占用的內存在解釋為char
數組時,是值為65的char
,后跟一個或多個null char
。 因此,當number
被解釋為以空值結尾的字節字符串時,它包含值65的單個字符。 因此,當您串流類型為char
*ptr
, char
重載將顯示具有值65的字符指向指針。當串流ptr
是char*
類型的時, char*
重載將輸出指向以空值終止的字節字符串,其中包含值65的單個字符,因此再次打印單個字符。
有關第3點的進一步說明:
請注意,在給定sizeof(char) < sizeof(int)
情況下,由於CHAR_BIT
至少為8 ,因此可以確保獲得一個以空值結尾的字節字符串,其中僅CHAR_BIT
一個字符。 也就是說,值65不可能不適合單個char
。
也許您的機器具有sizeof(char) == sizeof(int)
(在這種情況下,字節序無關緊要),並且number
后的內存為空字符只是一個巧合,因此再次構建了一個看起來像空值的東西-終止的字節字符串。 我說看起來像是因為如果您被允許讀取終止的空字符,它實際上只是一個。 由於在大多數系統上, CHAR_BIT
為8( POSIX要求 ),並且由於標准要求int
至少為32位 ,因此您的機器不太可能具有sizeof(char) == sizeof(int)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.