讓你不再害怕 0, ‘0‘,‘\0‘,「\0「,「0「,NULL,nullptr

2020-08-12 21:34:09

0

立即數,值爲零。ascii碼值爲0。

	char a = 0;//等價於:char a = '\0';
	printf("a=%d,a=%c\n",a,a);

輸出:

a=0,a=

‘0’

單引號表示一個字元,字元是0,字元0的ascii碼值爲48。

	char a = '0';//等價於:char a = 48;
	printf("a=%d,a=%c\n",a,a);

輸出:

a=48,a=0

‘\0’

單引號表示一個字元,\爲跳脫符號,表示字元的ascii碼值爲0, '\0’就是0。

	char a ='\0';//等價於:char a = 0;
	printf("a=%d,a=%c\n",a,a);

輸出:

a=0,a=

「0」

雙引號表示字串,所有字串都要在末尾加上’\0’結尾。
本字串只含有一個字元0,字元0的ascii碼值爲48。加上結尾的’\0’,一共有兩個字元,ascii是48和0。
字串長度遇到ascii 0就結束,所以這個字串長度計算是1:。

	char a[] ="0";//等價於:char a[] = {48,0};
	
	printf("字串佔記憶體:%d\n",sizeof(a));	
	printf("字串有效字元長度:%d\n",strlen(a));
	printf("字串值:%s\n",a);
	printf("記憶體值a[0]:%d,a[1]:%d,\n",a[0],a[1]); 

輸出:

字串佔記憶體:2
字串有效字元長度:1
字串值:0
記憶體值a[0]:48,a[1]:0,

「\0」

雙引號表示字串,所有字串都要在末尾加上’\0’結尾。
本字串只含有一個字元’\0’,字元0的ascii碼值爲0。加上結尾的’\0’,一共有兩個字元,ascii都是0。
而字串長度遇到ascii 0就結束,所以這個字串長度計算也是0:。

	char a[] ="\0";//等價於:char a[] = {0,0};
	
	printf("字串佔記憶體:%d\n",sizeof(a));	
	printf("字串有效字元長度:%d\n",strlen(a));
	printf("字串值:%s\n",a);
	printf("記憶體值a[0]:%d,a[1]:%d,\n",a[0],a[1]);  

輸出:

字串佔記憶體:2
字串有效字元長度:0
字串值:
記憶體值a[0]:0,a[1]:0,

NULL

在C中,NULL爲(void*)指針型別

#define NULL ((void*)0)  

:C++中,void 型別的指針, 不可以隱式轉換成其他指針型別. NULL不能爲(void)0,直接就是0:

#define NULL 0  

這樣在遇到函數過載的時候,容易搞錯。比如:

int test( int a);
int test( int* a);
test(NULL);//我們一般以爲是呼叫指針函數int test( int* a),實際是呼叫int test( int a)。

上述,因爲NULL被認爲是指針,我們以爲上面是呼叫指針函數int test( int* a),
實際上C++中NULL就是0,所以是呼叫int test( int a)。
於是程式出錯,而且錯誤不明顯,有時候我們很難找到原因。

那麼,怎麼辦呢?機會就在C++11的nullptr

nullptr

nullptr是C++ 11新增的標準庫定義,專門用來給指針賦值。
可以把它看成一個標準類,你能在網上搜到其簡單的實現。
nullptr既可以實現指針轉換,又不會引起NULL的過載歧義。

int test( int a);
int test( int* a);
test(nullptr);

以上就會呼叫指針函數int test( int* a),和NULL不一樣了。
這樣程式閱讀清晰,避免錯誤。

趕緊用起來!