1. 程式人生 > >NULL、nullptr和0的區別

NULL、nullptr和0的區別

在進行C/C++編碼時,我們經常會用到空指標,這裡簡單介紹一下NULL、nullptr以及0的區別。

一、NULL和0

NULL其實就是整數0,標頭檔案中通過巨集定義將NULL定義為0。 因此,當呼叫如下程式碼時,編譯將會產生歧義

void fun(int v){
	printf("int\n");
	return ;
}

void fun(char *p){
	printf("point\n");
	return ;
}

int main(){
	fun(NULL);
	return 0;
}

使用GCC/G++ 5.4.0編譯時報錯如下

null.cc: In function ‘int main()’:
null.cc:14:10: error: call of overloaded ‘fun(NULL)’ is ambiguous
  fun(NULL);
          ^
null.cc:3:6: note: candidate: void fun(int)
 void fun(int v){
      ^
null.cc:8:6: note: candidate: void fun(char*)
 void fun(char *p){
      ^

二、nullptr

為了避免上述歧義,C++11引入了nullptr,其型別為nullptr_t,不能隱式的轉換為整型,但是可以隱式轉換布林型別。執行下列程式碼將呼叫函式fun(char *p),避免產生歧義。

int main(){
	fun(nullptr);
	return 0;
}