在C語言中,咱們有時候看到NULL,有時候也看到'\0',那它們之間有什麼區別呢?算法
本質來講,NULL,0,'\0'都是同樣的,都是值0。是的,你沒有聽錯。說到這本文差很少應該結束了。不過爲了避免被打,仍是繼續說一說。它們雖然值都是0,可是含義倒是不同的。編程
雖然值是0,可是它的含義不同,或者說它的類型不同。NULL是指針類型,不過它是空指針,即值爲0。bash
//來源:公衆號【編程珠璣】 博客:https://www.yanbinghu.com
//null.c
#include<stdio.h>
int main(void) {
int a = NULL;
printf("%p\n",a);
return 0;
}
複製代碼
咱們編譯它:微信
$ gcc -o null null.c
null.c: In function ‘main’:
null.c:14:10: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
int a = NULL;
^
複製代碼
它給了咱們一個警告,提示嘗試將指針轉換爲整數。這也就正驗證了咱們前面的說法。數據結構
實際上NULL一般是以下定義:工具
#define NULL (void*)0
複製代碼
因此,若是要給一個指針類型初始化,那麼你給它一個NULL,使得可以明顯的看到這是一個指正。ui
固然,在C++中,你更應該使用nullptr,而不是NULL。spa
咱們都知道\是轉義符,用單引號包起來,再加轉義,實際上就是0,只不過它表示的是字符。就向下面這樣:指針
//來源:公衆號【編程珠璣】 博客:https://www.yanbinghu.com
//nul.c
#include<stdio.h>
int main(void) {
char a = '\0';
char b = '0';
printf("a = %d,b = %d\n",a,b);
return 0;
}
複製代碼
編譯運行:code
$ gcc -o nul nul.c
./nul
a = 0,b = 48
複製代碼
咱們最多見到的就是它做爲字符串的結束符。因此咱們經常會看到下面這樣的寫法:
char str[16];
/*do something*/
str[15] = '\0';
複製代碼
還記得printf是如何打印字符串,以及strcmp比較中止規則嗎?是的,它們都以遇到'\0'結束。
注意,它和'0'徹底不同。經過打印就能夠看到了,實際上'\0'的值就是0。
須要特別注意的是,若是'\0'的0後面跟八進制的數,則會被轉義。因此**'\60'與'0'的值一致**。
這個不用多解釋。
int a = 0;
複製代碼
用雙引號包裹的0是字符串,咱們看不到的是它結尾還有一個’\0‘
#include<stdio.h>
int main(void) {
char str[] = "0";
printf("sizeof str is %d,string len is %d\n",sizeof(str),strlen(str));
return 0;
}
複製代碼
運行結果:
sizeof str is 2,string len is 1
複製代碼
這也是字符串,只不過是兩個空字符。字符串長度爲0。
字符串。字符串長度爲1,佔用空間2字節,是一個空格加空字符。
到這裏你應該明白了,它們的值可能同樣,但賦予的含義卻不同,爲了代碼良好的可讀性,你應該在恰當的時候使用合適的值。
微信公衆號【編程珠璣】:專一但不限於分享計算機編程基礎,Linux,C語言,C++,數據結構與算法,工具,資源等編程相關[原創]技術文章。
![]()