這個問題涉及到字符編碼與數組的存儲機制,還是讓我們通過一個實例來解釋吧,先看下面這個簡單的程序以及它的運行結果,如下圖:
首先我們定義兩個數組str1和str2,一個以漢字的方式初始化,代碼第10行,另外一個以字節數字方式初始化,見代碼11行。表面上來看,這兩個數組是完全不一樣的,接著讓我們分別以不同的方式輸出它們的內容。首先在13行和14行分別以字符串方式輸出它們的內容,在右邊的程序執行結果可見它們輸出了同樣的內容——西安歡迎您。此外我們還定義了一個數組arr1,并通過數字給它賦值,代碼12行,在15行我們將arr1轉換為一個字符串,并且輸出它的內容,我們同樣得到了相同的結果。接下來,我們再以數字的方式輸出str1、str2以及pstr3的內容,見代碼17-28行,在右側的輸出結果中可以看到,三種方式還是輸出了相同的內容。
由上面程序可見,雖然通過不同的方式對數組進行初始化賦值,但是使用同樣的輸出方式,就會得到同樣的輸出結果,可見它們的實質內容是相同的。
為什么會這樣呢,這就涉及到字符的存儲問題,我們知道,計算機內部的數據都是有0和1組成的二進制數,要表示字符,就需要對它們進行編碼,因為計算機技術最初是從美國發展起來的,所以最初的ASCII編碼只有英文字母、數字和控制字符,一共256個。后來隨著計算機的發展,應用越來越廣,其它國家為了使計算機能處理自己的語言,就發明了很多別的編碼方式,各種編碼方式之間存在嚴重的兼容性問題,于是為了統一,后來人們提出了UNICODE編碼。在這種編碼方式下,每個漢字用兩個字節存儲,如果以字符串輸出,就會顯示字符的內容,如果以數字輸出,就會顯示它的編碼。
目前,大部分的現代編譯器都開始使用UNICODE進行字符串編碼,比如我用的是VS2017,就會出現數組內容是數字,卻能輸出漢字的情況,如果同樣的代碼,換作一些比較老的編譯器,可能就不會輸出漢字,而是一些亂碼了。