前言
c和c++的變數名是對大小寫敏感的,因此null和null並不是一回事,前者是c/c++中的系統關鍵字,null並不是。c++11以後又引入了nullptr,用以解決null在隱式轉換和作為函式傳入引數時的二義性問題。
在c++11以前,在c/c++語言中,我們常常用null作為指標變數的初始值。而在c++11之後,卻不建議你這麼做。
其實null根據命名全大寫可以看出來,它是乙個常量,既然是常量,就需要進行巨集定義。c語言的標準標頭檔案是這樣定義的
#define null ((void*)0)
而到了c++中,則變成了
#define null 0
查閱stddef.h,可以看到如下定義
#undef null
#if defined(__cplusplus)
#define null 0
#else
#define null ((void *)0)
#endif
從定義中可以看出,c++中,null其實就是0,但是也可以用作空指標,只是用作空指標可能是為了相容c,迫於無奈。
#includeusing namespace std;
void test(void *p)
但是下面的c++**就會報錯
test.cpp:4:7:
error: cannot initialize a variable of type 'int *' with an lvalue of type 'void *' int* b=a;
與此同時,在malloc上,也存在類似的問題:
int len = 100; int p = malloc(len * sizeof(int)); // c推薦做法
int p = (int )malloc(len * sizeof(int)); // c++推薦做法
malloc函式返回值得型別是 void*,c不要求強制型別轉換,會自動進行隱式轉換,但是c++則需要,因為void* 不能轉換成其他型別的指標。 C 中NULL和nullptr的區別
看起來null和nullptr都是代表空指標,但是null在過載函式的時候卻匹配到了引數為int的那個版本。這是因為在c 中,null的定義一般是這樣的 ifdef cplusplus define null 0 else define null void 0 endif cplusplus 可以看...
C 中NULL和nullptr的區別
目錄 一 c程式中的null 二 c 程式中的null 三 c 中的nullptr 總結 其他 在沒有c 11的nullptr的時候,我們怎麼解決避免這個問題呢?在c語言中,null通常被定義為 define null void 0 所以說null實際上是乙個空指標,如果在c語言中寫入以下 編譯是沒...
C 中的NULL 和nullptr的區別
在寫c 的程式的時候,可以看到null 和nullptr兩種空指標。他們有哦什麼區別勒?一 c程式中的null 在c語言中,null通常被定義為 define null void 0 所以說null實際上是乙個空指標,如果在c語言中寫入以下 編譯是沒有問題的,因為在c語言中把空指標賦給int和cha...