C/C++空指针、NULL、nullptr、0

#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,一般用来比较指针是否是一个野指针
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值