NULL,0,'\0',「0」,"\0"你真的分得清嗎?

前言

在C語言中,咱們有時候看到NULL,有時候也看到'\0',那它們之間有什麼區別呢?算法

本質

本質來講,NULL,0,'\0'都是同樣的,都是值0。是的,你沒有聽錯。說到這本文差很少應該結束了。不過爲了避免被打,仍是繼續說一說。它們雖然值都是0,可是含義倒是不同的。編程

NULL

雖然值是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'

咱們都知道\是轉義符,用單引號包起來,再加轉義,實際上就是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'的值一致**。

0

這個不用多解釋。

int a = 0;
複製代碼

"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"

這也是字符串,只不過是兩個空字符。字符串長度爲0。

" "

字符串。字符串長度爲1,佔用空間2字節,是一個空格加空字符。

總結

到這裏你應該明白了,它們的值可能同樣,但賦予的含義卻不同,爲了代碼良好的可讀性,你應該在恰當的時候使用合適的值。

微信公衆號【編程珠璣】:專一但不限於分享計算機編程基礎,Linux,C語言,C++,數據結構與算法,工具,資源等編程相關[原創]技術文章。

公衆號編程珠璣
相關文章
相關標籤/搜索