#ifndef NULL
#ifdef __cplusplus
#define NULL 0 //C++中使用
#else
#define NULL ((void *)0)//C中使用
#endif
#endif
1、0和NULL
NULL是一个宏,0在C和C++中都可以当作空指针常量(null pointer constant),即((void*)0);
在C和C++中都就可以使用NULL和0,但是C中通常是NULL,c++中通常使用0(或者nullptr);
空指针常量:值为0的整数常量表达式,或强制转换为void *
类型的表达式,称为空指针常量
在C语言中常数0和(void*)0都是空指针常量;在C++中常数0是空指针常量,而(void*)不是;
NULL实际上是一个void *的指针,在C语言中,使用时把void *指针赋值给int *等类型的变量时,会隐式转换成相应的类型;
而在C++中编译是要出错的,因为C++是强类型的,void *是不能隐式转换成其他指针类型(int* p = (void*)0,会报错)
2、nullptr
nullptr时C++独有的,C++引入nullptr时为解决NULL为0时,指针类型和int类型存在二义性
void fun(int){} //@1
void fun(char*)() //@2
int main()
{
fun(NULL); //C++中调用@1,C中调用@2
fun(nullptr); //调用@2
}
3、空指针
在C和C++中,NULL的地址均不可访问,也就是不能取出NULL代表的地址上的值;
void fun(int* node)//值传递
{
int n = 20;
node = &n;
cout << *node << endl;
}
int main()
{
int* node = NULL;
fun(node);
cout << *node << endl;//会报错,空指针
return 0;
}
在fun中,改变指针node的指向,,可以访问node的值,但是作用域只是在fun中,回到main中并没有改变node指针的值,其值还是NULL,不可访问,所以会报错
改变传递的指针的指向不可以传递改变,而改变传递的指针的值则可以传递改变
void fun(int** node)
{
int n = 20;
*node = &n;
cout << *node << endl;
}
int main()
{
int* node = NULL;
fun(&node);
cout << *node << endl;
return 0;
}
//或者
void fun(int*& node)
{
int n = 20;
node = &n;
cout << *node << endl;
}
int main()
{
int* node = NULL;
fun(node);
cout << *node << endl;
return 0;
}
'\0'、'0'、 0、 NULL
- '\0'是转义字符,对应ASCII码值为0,本质是0;常用于表示字符串的结尾标志
- '0'是字符,对应ASCII值为48,本质是48;
- 0是int类型数字,本质是0;
- NULL是一个表达式,强制类型转换为void*类型的0,一般用来比较指针是否是一个野指针