Summary
1)C語言中的單引號
用來表示字元字面量
;字元字面量的本質是一個整數
;
2)C語言中的雙引號
用來表示字串字面量
;字串字面量的本質是一個指標(記憶體地址)
;
3)低於0x08048000
這個值的記憶體地址都是不能直接訪問的,訪問就會段錯誤(可訪問的地址值需要大於等於該值,32位系統);
4)注意:char型別
和char*型別
要用正確的字面量進行初始化
;雖然char a = ""; char* s = 'a';都能編譯的過,但使用的時候就會出意想不到的段錯誤
。
5)字元字面量和字串字面量的混淆使用在C編譯器中可以編的過,但要注意warning,工程中對於所有的warning一定都要當成error來處理
。
單引號和雙引號
C語言中的單引號
用來表示字元字面量
;字元字面量的本質是一個整數
,'a'在記憶體中佔1個位元組,'a'+1 表示'a'的ASCII碼值加1,結果為'b'。
C語言中的雙引號
用來表示字串字面量
;字串字面量的本質是一個記憶體地址(地址值),"a"在記憶體中佔有2個位元組,"a"+1 表示指標運算,結果指向"a"中的結束符'\0'。
程式碼閱讀:
char* p1 = 1; char* p2 = '1'; char* p3 = "1"; printf("%s, %s, %s", p1, p2, p3); printf('\n'); printf("\n");
程式碼解析:
p1 用一個整數字面量1進行初始化,有warning,但可以編的過,因為指標本質也是一個32(64)位的整數值 p2 用一個字元字面量'1'進行初始化,同p1。字元'1'本質也是一個整數,值為49 p3 用一個字串字面量"1"進行初始化,字串字面量的本質是一個指標(記憶體地址),沒有問題 printf(param1, ...)的第一個引數是一個指標,地址值 printf('\n')可以編的過,但是warning,同p2,使用10作為一個地址值傳給printf函式 printf("\n")可以編的過,使用一個字串字面量作為引數,換行 綜上:p1 p2 printf('\n')都是可以編的過,但是有問題的語句,在進行列印的使用就會段錯誤, 因為使用了錯誤的地址值,訪問了不該訪問的記憶體,野指標!!!
程式碼閱讀:
char c = " "; while(c == "\t" || c == " " || c == "\n") { scanf("%c", &c); }
程式碼解析:
c的初始化:使用一個只有空格字元的字串字面量進行初始化;實際上是用一個指標(記憶體地址值)進行初始化 由於char型別佔1個位元組,指標型別佔4位元組(32位),所以會發生截斷 再去進行while迴圈的判斷,第一次就為false,不會進到迴圈中 所以要正確判斷字元型別和字串型別,確保使用的型別是正確的: 修改,將"\t"等都改成'\t'。
本文總結自“狄泰軟體學院”唐佐林老師《C語言進階課程》。
如有錯漏之處,懇請指正。