C 中NULL和nullptr的區別

2021-10-03 09:05:24 字數 1125 閱讀 7682

前言

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