一直對於單引號和雙引號有些混淆,本節討論一下單引號和雙引號的問題。
ide
1、基本知識spa
一、C語言中單引號用來表示字符字面量
指針
二、C語言中雙引號用來表示字符串字面量
blog
好比:'a'表示字符字面量,在內存中佔1個字節, 'a'+1表示的是'a'的ASCII碼加1,結果爲'b'
內存
"a"表示字符串字面量,在內存中佔2個字節,其中,第一個字節是"a",第二個字節是結束符'\0',"a"+1表示的是進行指針運算,結果指向"a"結束符'\0'。
字符串
2、代碼分析
編譯器
下面存在這樣一段代碼
string
#include <stdio.h> int main() { char* p1 = 1 ; char* p2 = '1'; char* p3 = "1"; printf("%s, %s, %s", p1, p2, p3); printf('\n'); printf("\n"); return 0; }
那麼這段代碼是否合法呢?
it
在Linux下,編譯運行後,結果以下
io
爲何會報段錯誤呢?下面咱們進行分析。
首先,咱們看
char* p1 = 1 ; char* p2 = '1'; char* p3 = "1";
char* 在是指針,根據指針的概念,對應的指針變量存儲的應該是一個地址,那麼上述代碼的內存分佈能夠理解以下
也就是說,p1和p2是在內存的低地址處。這裏有一點須要記住,程序的內存地址,必需要小於0x08048000,否則就會產生段錯誤。
3、擴展
#include <stdio.h> int main() { char c = " "; while( (c == "\t") || (c == " ") || (c == "\n") ) { scanf("%c", &c); } return 0; }
這段程序,在Linux中運行結果以下
能夠看到程序運行之後,直接就完了,並無咱們想象中的須要輸入的狀況。爲何會這樣呢?
分析以下
char c = " ";
這段代碼等同於
char c = "string";
一、編譯後字符串"string"的內存地址被賦值給了變量c
二、內存地址佔用4個字節,而變量c只佔用1個字節
三、因爲類型不一樣,賦值後產生截斷
所以,這裏須要將全部的雙引號改爲單引號,就能夠實現。
4、總結
一、單引號括起來的單個字符表明整數
二、雙引號括起來的字符表明字符指針
三、C編譯器接受字符和字符串的比較,無任何意義
四、C編譯器容許字符串對字符變量賦值,只能獲得錯誤