單引号和雙引号
- C語言的單引号用來表示字元字面量
- C語言的雙引号用來表示字元串字面量
- 'a' 表示字元字面量,在記憶體中占一個位元組, ‘a’ + 1 表示 ‘a’ 的 ASCII 碼加1,結果為 ‘b’
- "a" 表示字元串字面量,在記憶體中占2個位元組, “a”+1 表示指針運算,結果為指向“a”結束符 ‘\0’
分析下面的合法性
#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;
}
- 字元字面量(單引号)被編譯為對應的ASCII碼(單個字元代表整數 %d)
- 字元串字面量(雙引号)被編譯為對應的記憶體位址(字元代表字元指針)
- printf的第一個參數被當成字元串記憶體位址
- 記憶體的低位址空間不能在程式中随意通路
分析圖:

上圖低于圈出來的是低位址,不能随意通路 通常字元串字面量的位址都是大于那個值的(即是有個合法的位址)
混淆概念的的代碼
#include <stdio.h>
int main()
{
char c = " ";
while( (c == "\t") || (c == " ") || (c == "\n") )
{
scanf("%c", &c);
}
return 0;
}
// 這邊會出現截斷的情況
// 改進的地方 都改成單引号
char c=“string”
字元串字面量被編譯器編譯為對應的記憶體位址,指派給變量C,記憶體位址占用4個位元組(32位機器)或者8個位元組(64位機器),而變量C隻占用一個位元組,由于類型不同,指派後将産生截斷 , 是以後續判斷不成立
小結
- 單引号括起來的當個字元代表整數
- 雙引号括起來的字元代表字元指針
- C編譯器接收字元和字元串的比較,但是無任何意義
- C編譯器允許字元串對字元變臉指派,隻能得到錯誤