0,NULL和nullptr的区别
这次我回过头给大家讲解一下大家平常使用非常平凡0,NULL和nullptr的区别。
别问我为什么要介绍他们的区别那我只能用图来表示我的回答
一.在C语言中 NULL其实就是一个宏(表示把 0 强制类型转换成void *)
#define NULL (void *)0
char *p = NULL;
二.在C++中
#define NULL 0
char *p = NULL;
char *q = nullptr;
那么问题来了为什么 C++中 NULL 和 C中的 NULL 表示的宏的意义不同呢? 难道C++中的NULL 不可以表示 (void *)0吗?
是这样的: C++是一门 严格校验类型的语言,它不允许(void *)隐式转换成其他类型,如果你真要这么干
#define NULL (void *)0 在C++中,当编译 char *p = NULL; 时 编译就会出错。所以NULL 只好被定义成 0 但是这种方式会产生二义性:
void func(int num){
cout << " int " << endl;
}
void func(char *ptr){
cout << " pointer " << endl;
}
当我们调用 func(NULL)的时候 编译器到底会去调用哪个函数呢? NULL是 0 的一个替换 , 也表示一个空指针 这里两个函数好像都满足条件 所以 这就是我们所说的二义性 。
因此为了解决上面的问题 C++11 引入了一个 新的空指针 nullptr 专门用来区分 0 和 NULL的
func(0), func(nullptr)这样才会合理。
nullptr是 nullptr_t 类型 不是整数类型 可以隐式转换成任意类型的 指针,所以在这里 我推荐大家用nullptr
三.说完了上面的 区别 我们来简单的讲讲 0,'0', '\0',"0", FALSE, NULL
咦? 乍一眼看过去 他们好像都表示 0; 没有什么区别呀,真的是这样吗?
0:4个字节 不用多说
'0':一个字节 表示 字符0 ASCII码值为 48
'\0':这个表示 在C语言中字符串的结束符 "..... \0"
"0":表示一个字符串 实际占两个字节(如果是 const char*的话),=> "0 \0"
FALSE:在老版本中是一个宏 替代 0 占4个字节, 现在bool类型 表示假 占 1个字节
NULL:上面介绍过了 不用多说
更多的C/C++编程我会在下面的文章中陆续的分享,也可以关注‘奇牛学院’
来一起讨论