簡體   English   中英

為什么在不使用指針的情況下獲得相同的值

[英]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打印Aptr打印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實現,因為它對其他類型沒有意義。

兩者都打印相同的結果,因為:

  1. ostream::operator<<具有char*char的重載(請參見此處此處 )。
  2. char*重載將參數解釋為指向以null結尾的字節字符串的指針,而不是指向單個char的指針。
  3. 顯然,您的計算機是低端字節序的,並且具有sizeof(char) < sizeof(int) (與==相反)。 這意味着,由number占用的內存在解釋為char數組時,是值為65的char ,后跟一個或多個null char 因此,當number被解釋為以空值結尾的字節字符串時,它包含值65的單個字符。

因此,當您串流類型為char *ptrchar重載將顯示具有值65的字符指向指針。當串流ptrchar*類型的時, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM