C語言查漏補缺——單引號和雙引號

        一直對於單引號和雙引號有些混淆,本節討論一下單引號和雙引號的問題。
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下,編譯運行後,結果以下
image.pngio

        爲何會報段錯誤呢?下面咱們進行分析。

        首先,咱們看

    char* p1 =  1 ;
    char* p2 = '1';
    char* p3 = "1";

        char* 在是指針,根據指針的概念,對應的指針變量存儲的應該是一個地址,那麼上述代碼的內存分佈能夠理解以下

image.png

        也就是說,p1和p2是在內存的低地址處。這裏有一點須要記住,程序的內存地址,必需要小於0x08048000,否則就會產生段錯誤。



3、擴展

#include <stdio.h>

int main()
{

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

        這段程序,在Linux中運行結果以下

image.png

        能夠看到程序運行之後,直接就完了,並無咱們想象中的須要輸入的狀況。爲何會這樣呢?

        分析以下

char c = " ";

        這段代碼等同於

char c = "string";

        一、編譯後字符串"string"的內存地址被賦值給了變量c

        二、內存地址佔用4個字節,而變量c只佔用1個字節

        三、因爲類型不一樣,賦值後產生截斷


        所以,這裏須要將全部的雙引號改爲單引號,就能夠實現。



4、總結

        一、單引號括起來的單個字符表明整數

        二、雙引號括起來的字符表明字符指針

        三、C編譯器接受字符和字符串的比較,無任何意義

        四、C編譯器容許字符串對字符變量賦值,只能獲得錯誤

相關文章
相關標籤/搜索