[CPP] NULL,nullptr,空指针

NULL和nullptr

首先看看NULL的定义,在C++中,直接定义为0,在C中定义为((void *)0),空指针。因为在C++中需要显示的类型转换int *p = (void *) 0这样会报错,而C可以隐式转换。

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

nullptr是C++11的一个关键字,不是整型也不是指针类型,但是可以转换为任意的指针类型,nullptr的实际类型是std:nullptr_t。所以有以下例子

int i = NULL; // OK
int i = nullptr; // 不能为整型
int* p = NULL; //ok - int转为指针
int* p = nullptr; // ok

nullptr的出现解决了一个容易出现混淆的地方。假设我们有重载的函数

void func(int x);
void func(int* x);

我们想调用func(NULL),实际上我们是想调用void func(int* x),但是因为NULL是0,所以调用了void func(int x),如果是func(nullptr)则调用的是void func(int* x),符合我们的想法,因为nullptr不能转为int,可以转为指针。

所以为了避免风险,如果使用C++11标准,空指针就用nullptr吧。

另外指针定义为空指针,那空指针指向的地址是什么呢?空指针在C/C++中占有特殊的地址,通常它是用来判断一个指针的有效性的。空指针一般定义为0。现代操作系统都
会保留从0开始的一块内存,至于这块内存有多大,视不同的操作系统而定。一旦程序试图访问这块内存,系统就会触发一个异常/信号。操作系统为什么要保留一块内存,而不是仅仅保留一个字节的内存呢?这是因为一般内存管理都是按页进行管理的,根本就无法单纯保留一个字节,而至少要保留一个页面。保留一块内存也有额外的好处,可以检查诸如p=NULL; p[1]之类的内存错误。

参考

作者:芒果和小猫

出处:https://www.cnblogs.com/WAoyu/p/13176017.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   芒果和小猫  阅读(607)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题