我們上回說到內(nèi)存的分配,是通過CPU加載器處理硬件內(nèi)存,但是沒有提到內(nèi)存地址,我在這里補(bǔ)充點(diǎn),內(nèi)存地址分為真實(shí)地址和虛擬地址,我們電腦中運(yùn)行的都是虛擬地址,而真實(shí)地址并不直接用于電腦的使用,而是使用需要CPU進(jìn)行處理后得到的虛擬地址。這個具體原因會在后面的指針中給大家說個明白。
可能有朋友用過我第一節(jié)內(nèi)容中提到的vs code,在完全安裝好后,想要在輸出時輸出漢語,但是一經(jīng)編譯發(fā)現(xiàn),怎么出來的是亂碼。
大家都知道,大多數(shù)國家都有自己的語言,電腦也是,電腦的語言現(xiàn)在只有一個,就是那一大串的0和1,而在編寫代碼的時候,我們使用的人類的語言,為什么它們能夠互通呢,我就舉例子說明:我們?nèi)獾臅r候,往往會聽不懂外國友人在說些什么,這時候,我們就要隨身帶著一個翻譯軟件,或者一個翻譯工作者,他們通過漢語和英語的對照表,就可以明白其他人在說什么。所以人類和電腦的交流也是這樣,如果使用電腦語言0和1來編程,可能大部分程序員就很頭疼,看不懂,也不知道怎么用。但是如果用人類的語言,那么電腦就壓根不識別。所以這個時候,人們就發(fā)明了計算機(jī)語言對照表,也就是我們常說的編碼。
具體是怎么用的,我們還是通過例子說明,我們把這些二進(jìn)制數(shù)字當(dāng)做一個編號,把我們常用的 “a"看做學(xué)生,這樣就可以一個編號代表一個學(xué)生。我們喊到1號學(xué)生的時候,是不是就對應(yīng)到a同學(xué)了。而電腦一個道理,當(dāng)我們在編輯器中是用“a”的時候,編譯器在編譯階段就會編譯成0110 0001了,這中對應(yīng)關(guān)系就是我們常說的字符集。
嚴(yán)格的來說,編碼并不是字符集,字符集是并不是字符編碼,字符集就像我說的對照表,只是純粹的二進(jìn)制和常用字符的關(guān)系。而編碼是將字符集中的字符取出來,并編碼成電腦語言中對應(yīng)二進(jìn)制數(shù)的過程。
理解了基礎(chǔ)知識,然后我們就說說出現(xiàn)亂碼的問題:
由于電腦最開始出現(xiàn)在美國,但是人卻無法有效的使用電腦,所以美國人自然就以自己的語言為標(biāo)準(zhǔn),創(chuàng)造了ASCII編碼,而這套編碼中沒有漢字。但是隨著技術(shù)的進(jìn)步,ASCII碼就無法滿足人類的需求,所以就出現(xiàn)了其他的編碼形式,Unicode碼,utf-8等,uft-8是Unicode的可變長度的升級,支持所有語言,所以也被稱為萬國碼,而vs code 默認(rèn)就是uft-8編碼。
這里問題就來了,為什么vs code 用utf-8編碼,但是在編譯后還會出現(xiàn)亂碼。這時候,我們就要注意了,編碼一般分為兩種形態(tài),源文件形態(tài)和編譯形態(tài),我們在寫代碼的時候,編輯器使用的是utf-8,所以我們輸入漢字的時候發(fā)現(xiàn)不會出現(xiàn)亂碼。但是在編譯時,編譯器可用的可不是uft-8了。編譯器一般是根據(jù)我們系統(tǒng)的編譯模式進(jìn)行編譯的,我的電腦是Windows10系統(tǒng),其編碼格式是gbk,這下明白了嗎,用gbk去編譯utf-8,不出現(xiàn)錯誤才怪。最后就是請不要糾結(jié)為什么英文沒有錯誤,而中文有錯誤。原因就是編碼出現(xiàn)的那一天,就是英文的,其他編碼格式都是在這個基礎(chǔ)上進(jìn)行擴(kuò)展的。
我們既然明白了這其中的原因,就來修改吧,方法有兩種:
第一種是暫時的,我們點(diǎn)擊右下角有個utf8的按鈕,點(diǎn)擊后上方搜索框會出現(xiàn)很多編碼,向下滑,找到simplified Chinese(gbk)后選中即可。

第二種是改變編輯器的編碼:打開左上角文件,選擇首選項,然后選擇設(shè)置,然后選擇文本編輯器,選擇文件,然后就可以看到Files:Encoding選項,在下拉框中勾選GBK選項即可。這種方式是一勞永逸的方法。
首選項-》設(shè)置
設(shè)置完成后,重啟vs code ,我們再F5運(yùn)行代碼試試。這下就是中文的了。
我們了解了字符集,那么我們?nèi)绾问褂米址兀?/p>
字符集中的常用字符我們平時都可以在C語言中直接使用,比如a、你好、123等,我們在編寫代碼的時候可以直接寫出來。但是,既然它有對應(yīng)的編碼值,我們是不是可以使用編碼值來表示,答案是肯定的,有個小問題是,我們在使用這些編碼值的時候如果直接寫為:“68”的話,編譯后,它仍然是68,所以我們想要正確的使用編碼值,就需要知道這個數(shù)字是八進(jìn)制還是十六進(jìn)制,然后分別在數(shù)字前面加上“”和“\x”的轉(zhuǎn)義符號,然后就會正常的輸出為字母“h”了。
當(dāng)然,我們在輸出的時候,不只會遇到這些問題,即便我們正常的使用編碼,但是還是會遇到:輸出值往往會在一行顯示,沒有換行,不能輸出特殊的雙引號等現(xiàn)象,這是因?yàn)镃語言中對這些符號進(jìn)行了特殊的定義,所以不能直接表示。為了能夠使用這些特殊符號,我們往往在這些符號前面加上轉(zhuǎn)義字符“”來使用,比如下面就可以直接輸出雙引號,換行可以用“\n”等。
#include
int main(int argc, char const *argv[])
{
????puts(" " "); 這樣是不是就可以輸出雙引號了。
}
就我個人而言,這些特殊字符最好死記硬背下來,因?yàn)樵诰幊踢^程中,這些都是經(jīng)常用到的。