当前位置: 首页 > news >正文

【C++】nullptr C++中的空指针(C++11)

前言

在平时我们写C/C++代码时你可能会看到有人使用NULL表示空指针,也有人用nullptr表示空指针,那么你可能会很好奇它们都是空指针吗?为什么空指针有两种写法?下面就带你了解这背后的原理。

我们都知道NULL是C语言中的空指针,C++在大多数条件下是兼容C的,C++98及以前的空指针也都是用NULL表示,但是在C++11新特性中,我们用nullptr来表示指针空值,NULL仅仅只表示0。

C/C++中空指针NULL与nullptr

  • 一、C/C++中NULL的定义实现
  • 二、为什么要引入C++11要引入nullptr


一、C/C++中NULL的定义实现

在C语言中NULL的定义一般是:

#define NULL (void*)0 

但同时,也允许将NULL定义为整常数0。

在C++11中NULL的定义是:

#ifndef NULL
#ifdef __cplusplus //如果是C++文件,那么都会有 __cplusplus 标志
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

这段代码翻译过来就是如果是C语言中,那么NULL就被定义为

#define NULL ((void *)0)

如果是C++中,那么NULL就被定义为

#define NULL 0

二、为什么要引入C++11要引入nullptr

要回答这个问题我们首先看一段代码

#include<iostream>
using namespace std;
void f(int)
{cout << "f(int)" << endl;
}
void f(int*)
{cout << "f(int*)" << endl;
}
int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}

在这里插入图片描述
我们发现代码的第二行如果按照C++98的标准则是出现了奇怪情况,按照我们正常的想法f(0)应该进入void f (int),f(NULL)进入void f(int*),因此我们想要得到的结果是分别打印
f(int)
f(int*)
f(int*)
原因是 在C++98 中,字面常量 0 既可以是一个整形数字,也可以是无类型的指针 (void) 常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void )0 。

为了避免上述这个问题,C++11引入了nullptr关键字来表示指针空值。NULL只表示0;

注意:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void)0)所占的字节数相同。*
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
http://www.lryc.cn/news/850.html

相关文章:

  • 笔试题-2023-大疆-数字IC设计【纯净题目版】
  • Python dict字典方法完全攻略(全)
  • 用“AI“挑选一件智慧礼物
  • 【Spark分布式内存计算框架——Spark Core】4. RDD函数(下) 重分区函数、聚合函数
  • 智能工厂自动化设备如何将数据采集到物联网云平台上
  • SpringBoot整合Mybatis的核心原理
  • 滴滴一面:order by 调优10倍,思路是啥?
  • Vue框架学习篇(五)
  • (蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第1天(基础算法-上 专题)】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有75天
  • C++——继承那些事儿你真的知道吗?
  • leetcode 困难 —— N 皇后(简单递归)
  • AWS实战:Dynamodb到Redshift数据同步
  • 机器学习评估指标的十个常见面试问题
  • 常见的安全问题汇总 学习记录
  • 元宵晚会节目预告没有岳云鹏,是不敢透露还是另有隐情
  • 计算机视觉 吴恩达 week 10 卷积
  • JavaScript 函数定义
  • 设计模式:建造者模式教你创建复杂对象
  • 在C++中将引用转换为指针表示
  • PS快速入门系列
  • ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
  • JVM从看懂到看开Ⅲ -- 类加载与字节码技术【下】
  • 服务器常用的41个状态码及其对应的含义
  • 万里数据库加入龙蜥社区,打造基于“龙蜥+GreatSQL”的开源技术底座
  • 为什么不推荐使用CSDN?
  • apisix 初体验
  • time时间模块
  • 如何判断反馈电路的类型-反馈类型-三极管
  • C++ 实现生命游戏 Live Game
  • 什么是QoS?QoS是如何工作的?QoS的实验配置如何进行?