立即數,值爲零。ascii碼值爲0。
char a = 0;//等價於:char a = '\0';
printf("a=%d,a=%c\n",a,a);
輸出:
a=0,a=
單引號表示一個字元,字元是0,字元0的ascii碼值爲48。
char a = '0';//等價於:char a = 48;
printf("a=%d,a=%c\n",a,a);
輸出:
a=48,a=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的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的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,
在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是C++ 11新增的標準庫定義,專門用來給指針賦值。
可以把它看成一個標準類,你能在網上搜到其簡單的實現。
nullptr既可以實現指針轉換,又不會引起NULL的過載歧義。
int test( int a);
int test( int* a);
test(nullptr);
以上就會呼叫指針函數int test( int* a),和NULL不一樣了。
這樣程式閱讀清晰,避免錯誤。
趕緊用起來!