\0是C++中字符串的結尾標志,存儲在字符串的結尾,它雖然不計入串長,但要占一個字節的內存空間。在百度百科中查看\0詞條,會有這樣一句話:c/c++中規定字符串的結尾標志為'\0'。有人可能認為,在C語言裡(C++會不同),'\0'並不是字符型,而是int型。在這裡,我們姑且和百度詞條作者保持一致,認為\0與'\0'是等價的。由於不同處理器的位數不同,'\0'並不一定是8位的00000000。實際上,由於不同處理器的位數不同,sizeof(int)返回的結果也都不同,而sizeof(char)返回結果一般是1,對8位機來說,一個字節由8位組成,16位機一個字節由16位組成,我們通常用的電腦通常是32位的,即一個字節由32位組成,現在已經是64位機了。CPU一般是以字節為單元進行讀取的。但是一般情況下大家還是認同1Byte等於8bit的說法,因為這是構成的最小位數。
'\0'是轉義字符,意思是告訴程序,這不是數字0。'\0'和0兩者基本上可以通用,例如: string[i] != '\0'和string[i] != 0是一樣的。不過'\0'的類型是char型,而0是int類型,所以在大多數計算機上,sizeof(0) = 4而sizeof('\0') = 1,這在特殊情況下不可通用。另外擴展一下,'\0'與'0'也是不同的,他們都是字符,但是他們的ASCII碼是不同的:'\0' ASCII碼值為0,'0' 也可以寫成'\0x30' ASCII碼值為48。
在C語言中沒有專門的字符串變量,通常用一個字符數組來存放一個字符串。字符串總是 以'\0'作為串的結束符。因此當把一個字符串存入一個數組時,也把結束符 '\0'存入數組,並以此作為該字符串是否結束的標志。有了'\0'標志後, 就不必再用字符數組的長度來判斷字符串的長度了。
'\0'就是 字符串結束標志。比如說,把一個字符串賦值給數組:char str1[] = {"Welcome!"}。實際上數組str1在內存中的實際存放情況為: 'W' 'e' 'l' 'c' 'o' 'm' 'e' '!' '\0'。這後面的'\0'是由C編譯系統自動加上的。所以在用字符串賦初值時一般無須指定數組的長度, 而由系統自行處理。 把字符數組str1中的字符串拷貝到字符數組str2中。串結束標志'\0'也一同拷貝。
但是……也有一些例外情況發生。比如,假設我們指定了數組長度但數組長度不夠。
如:char str1[8] = {"Welcome!"}。由於字符組str1的長度為8,所以後面的信息會丟失,即'\0'丟失。
另外,如果在給數組賦值時,把每個字符單獨用引號括起來,也會丟失'\0'。
例如:char str1[] = {'W', 'e', 'l', 'c', 'o', 'm', 'e', '!'};
如果希望數組以'\0'結束,則要麼寫成:char str1[] = {"Welcome!"};
要麼寫成(人工添加'\0'):char str1[] = {'W', 'e', 'l', 'c', 'o', 'm', 'e', '!', '\0'};
要麼寫成(故意給數組預留一個空位):char str1[9] = {'W', 'e', 'l', 'c', 'o', 'm', 'e', '!', '\0'};
最後,有興趣的童鞋可以思考一下'\0'與NULL的區別,你會發現C語言中我們還有很多細節沒有注意到。