注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境:ubuntu 10.10
gcc版本:4.4.5
一、單引號和雙引號
1)c語言中的單引號用來表示字元字面量
2)c語言中的雙引號用來表示字串字面量
『a'表示字元字面量
在記憶體中佔1個位元組
』a'+1表示'a'的ascii碼加1,結果為'b'
"a"表示字串字面量
在記憶體中佔2個位元組
「a"+1表示指標運算,結果指向」a"結束符'\0'
3)下面的程式片段合法嗎?
char* p1 = 1; //error
char* p2 = '1'; //error
char* p3 = "1";
例項分析
單引號和雙引號的本質
14-1.c
#include int main()
操作:
1) gcc 14-1.c -o 14-1.out編譯有警告:
14-1.c: in function 『main』:
14-1.c:5:13: warning: initialization makes pointer from integer without a cast [enabled by default]
char* p1 = 1;
^警告:用整型數初始化指標
14-1.c:6:13: warning: initialization makes pointer from integer without a cast [enabled by default]
char* p2 = '1';
^14-1.c:11:2: warning: passing argument 1 of 『printf』 makes pointer from integer without a cast [enabled by default]
printf('\n');
^in file included from 14-1.c:1:0:
/usr/include/stdio.h:362:12: note: expected 『const char * __restrict__』 but argument is of type 『int』
extern int printf (const char *__restrict __format, ...);
^14-1.c:11:2: warning: format not a string literal and no format arguments [-wformat-security]
printf('\n');
^
執行出現段錯誤。
segmentation fault (core dumped)
二、小貼士
1)字元字面量被編譯為對應的ascii碼
2)字串字面量被編譯為對應的記憶體位址
3)printf的第乙個引數被當成字串記憶體位址
4)記憶體的低位址空間不能在程式中隨意訪問
程式例項分析1
p1指向0x00000001
p2指向0x00000031
p3指向0x080484d0
程式例項分析2
'\n'指向0x00000010,訪問時會產生段錯誤。
"\n"是合法顯示。
例項分析二、程式例項分析混淆概念的**
14-2.c
#include int main()
return 0;
}編譯有警告,執行沒有任何顯示,直接結束(判斷都是錯誤!)
這裡用了雙引號,變成位址占用4位元組,但是char只占用1個位元組,
後邊的比較肯定會發生錯誤(1位元組,最大255,肯定小於4位元組)
修改:""都改為''
char c = "string";
發生了什麼?
分析:1)編譯後字串」string「的記憶體位址被賦值給變數c
2)記憶體位址占用4個位元組,而變數c只占用1個位元組
3)由於型別不同,賦值後產生截斷
小結:1)單引號括起來的單個字元代表整數
2)雙引號括起來的字元代表字元指標
3)c編譯器接受字元和字串的比較,無任何意義
4)c編譯器允許字串對字元變數賦值,只能得到錯誤
單引號和雙引號
char p1 1 char p2 1 1 的ascii碼值為49 0和49位址處為作業系統使用,故訪問這些位址如printf s,s,s p1,p2,p3 會產生段錯誤。printf n n的ascii碼值為10,同理,段錯誤。a 表示字元常量,在記憶體中佔1個位元組,a 1表示 a 的ascii...
單引號( )和雙引號( )
關鍵是要養成良好的習慣.單引號 一般用在單字元,如 c 雙引號 一般用在字串,如 abc 如果巢狀使用的話,一般用交替方法,尤其是html中.如,也可以改成.在分割乙個字串時要用到str.split或者regex.split。簡單的單個字串的替換,直接用字串.split 單個字串 多個字串的替換用r...
mysql單引號 mysql單引號和雙引號
表名,列名最好用 esc下面那個,不用 會出錯 這就要從雙引號和單引號的作用講起 雙引號裡面的字段會經過編譯器解釋然後再當作html 輸出,但是單引號裡面的不需要解釋,直接輸出。例如 abc i love u echo abc 結果是 i love u echo abc 結果是 abc echo a...