1. 程式人生 > >NULL,0,\0,'0'的區別

NULL,0,\0,'0'的區別

我們在學習過程中經常遇到NULL,0,\0,'0',常常疑惑它們是什麼關係,下面就來分析一下:

1、NULL: NULL 即空指標,不過在C和C++中並不一樣。在VS 2013的庫檔案string.h中可以看到定義:

1 /* Define NULL pointer value */
2 #ifndef NULL
3 #ifdef __cplusplus
4 #define NULL    0
5 #else  /* __cplusplus */
6 #define NULL    ((void *)0)
7 #endif  /* __cplusplus */
8 #endif  /* NULL */

可以看出,在C中,NULL表示的是指向0的指標  ——(void*)0,而在C++中,NULL就直接跟0一樣了。但有一點值得注意的是:在C語言中,“當常量0處於應該作為指標使用的上下文中時,它就作為空指標使用”(《征服C指標》)。例如,下邊的指標定義和初始化是沒問題的(既沒警告也沒報錯):

 int * p = 0;    /* C language */

但是如果定義成下面這樣:

 int * p = 3;    /* C language */

 很明顯,這樣子做是有問題的。這一句可以編譯通過,但在VS 2013中有這樣的警告:“warning C4047: “初始化”:“int *”與“int”的間接級別不同”。

我又試了一下這一句在C++中的情況,VS 2013就直接報錯了:“ ‘int’ 型別的值不能用於初始化 ‘int *’ 型別的實體”。

因此,為了防止混淆,在C/C++中,當要將一個指標賦值為空指標的時候,都應該將它賦為NULL,而不是0。

 

2、 ‘\0’:‘\0’是一個“空字元”常量,它表示一個字串的結束,它的ASCII碼值為0(數值0,非字元‘0’)。注意它與空格' '(ASCII碼值為32)及'0'(ASCII碼值為48)不一樣的。

       有一種錯誤的程式寫法:使用NULL來結束字串。例如下邊的程式就是有問題的:

char str[4] = { '1', '2', '3', NULL };    /* C language */

在VS 2013中,會的這樣的警告:“warning C4047: “初始化”:“char”與“void *”的間接級別不同”。而在C++中,這一句是沒有問題的。

還有一點值得注意,如下的程式在C/C++中都是沒有問題的:

char str[4] = { '1', '2', '3', 0 };    / C/C++ language */

但為了防止混淆,在C/C++中,當要給一個字串新增結束標誌時,都應該用‘\0’而不是NULL或0。

綜上所述,在記憶體中  NULL 和  '\0' 和 '0' 都是一個8位的char型別,NULL 和  '\0' 值一樣,都是0,以數字方式讀取就是0,以字串讀取時就是'\0'或者null(和編譯器有關),而 '0' 在記憶體儲存著48,以字元讀取就是 '0' ,以數字讀取就是48,至於0,可能是char ,int ,float,double等型別,但是值和NULL和'\0'一樣,都是0。

 

printf("%d",'0');==>48

printf("%c",'0');==>0

 

printf("%c",0);==>空(即NULL)

printf("%d",0);==>0

 

那麼0+'0',0+'\0'分別是什麼呢?

printf("%c",0+'\0');==>空(NULL) 先轉換成int,然後ASCII編碼相加為0,%c輸出,轉換成char,所以輸出NULL

printf("%d",0+'\0');==>0                 先轉換成int,然後ASCII編碼相加為0,%d輸出,不用轉換,輸出數字0

 

printf("%c",0+'0');==>0

printf("%d",0+'0');==>48