天天看點

【C】14.單引号和雙引号

單引号和雙引号

  • C語言的單引号用來表示字元字面量
  • C語言的雙引号用來表示字元串字面量
  1. 'a' 表示字元字面量,在記憶體中占一個位元組, ‘a’ + 1 表示 ‘a’ 的 ASCII 碼加1,結果為 ‘b’
  2. "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的第一個參數被當成字元串記憶體位址
  • 記憶體的低位址空間不能在程式中随意通路

分析圖:

【C】14.單引号和雙引号
【C】14.單引号和雙引号

上圖低于圈出來的是低位址,不能随意通路 通常字元串字面量的位址都是大于那個值的(即是有個合法的位址)

混淆概念的的代碼

#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編譯器允許字元串對字元變臉指派,隻能得到錯誤