【C進階】14、單引號和雙引號

bryson發表於2021-09-26

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')都是可以編的過,但是有問題的語句,在進行列印的使用就會段錯誤,
    因為使用了錯誤的地址值,訪問了不該訪問的記憶體,野指標!!!

    image.png



  • 程式碼閱讀:

      char c = " ";
    
      while(c == "\t" || c == " " || c == "\n")
      {
          scanf("%c", &c);
      }
    

    程式碼解析:

    c的初始化:使用一個只有空格字元的字串字面量進行初始化;實際上是用一個指標(記憶體地址值)進行初始化
    由於char型別佔1個位元組,指標型別佔4位元組(32位),所以會發生截斷
    再去進行while迴圈的判斷,第一次就為false,不會進到迴圈中
    
    所以要正確判斷字元型別和字串型別,確保使用的型別是正確的:
    修改,將"\t"等都改成'\t'。

本文總結自“狄泰軟體學院”唐佐林老師《C語言進階課程》。
如有錯漏之處,懇請指正。

相關文章