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

news2024/11/28 10:44:44

前言

在平时我们写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.coloradmin.cn/o/331489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDK14 新特性详解,2020-03-17 正式发布

预览版&#xff1a;该功能在当前版本可以使用&#xff0c;如果效果不是很好的话&#xff0c;可能以后的其他版本就会删去该功能。 最终版&#xff1a;该功能在之前版本效果很好&#xff0c;之后的每个版本中都会存在该功能。 1、Switch&#xff08;最终版&#xff09; 和之前…

从线程原理的角度来看C++内存的使用

文章目录线程的内存结构栈帧线程/进程调度线程的进一步使用线程安全和可重入一般的内存使用static变量使用new关键字&#xff0c;访问堆上的内存类中的内存使用从上一篇文章来看&#xff0c;线程的使用是比较简单的。但是在c环境下使用线程&#xff0c;最难也是最麻烦的点在于对…

云原生安全2.X 进化论系列|揭秘云原生安全2.X的五大特征

随着云计算技术的蓬勃发展&#xff0c;传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。能够有效解决这些“痛点”的云原生技术正蓬勃发展&#xff0c;成为赋能业务创新的重要推动力&#xff0c;并已经应用到企业核心业务。然而&#xff0c;云原生技…

Mysql 数据类型

1、数值数据类型 1.1 整数类型(精确值) INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT MySQL支持SQL标准的整数类型INTEGER (或INT)和SMALLINT。作为标准的扩展&#xff0c;MySQL还支持整数类型TINYINT、MEDIUMINT和BIGINT。下表显示了每种整数类型所需的存储和范围。…

13.计算机视觉

13.计算机视觉 目录 图像增广 常用的图像增广方法 翻转和裁剪改变颜色结合多种图像增广方法 使用图像增广进行训练 多GPU训练 总结 微调 步骤 热狗识别获取数据集定义和初始化模型微调模型 总结 目标检测和边界框 边界框总结 目标检测数据集 下载数据集读取数据集演示总结 锚…

【3】深度学习之Pytorch——如何使用张量处理表格数据集(葡萄酒数据集)

张量是PyTorch中数据的基础。神经网络将张量输入并产生张量作为输出&#xff0c;实际上&#xff0c;神经网络内部和优化期间的所有操作都是张量之间的操作&#xff0c;而神经网络中的所有参数&#xff08;例如权重和偏差&#xff09;也都是张量。 怎样获取一条数据、一段视频或…

Java面试知识点

工作也有好些年了&#xff0c;从刚毕业到前几年看过无数的面试题&#xff0c;总想着自己写一个面试总结&#xff0c;随着自我认识的变化&#xff0c;一些知识点的理解也越来越不一样了。写下来温故而知新。很多问题可能别人也总结过&#xff0c;但是答案不尽相同&#xff0c;如…

纯css实现loading加载中(多种展现形式)

前言 现如今网页越来越趋近于动画&#xff0c;相信大家平时浏览网页或多或少都能看到一些动画效果&#xff0c;今天我们来做一个有意思的动画效果&#xff0c;纯 css 实现 loading 加载中&#xff08;多种展现形式&#xff09;&#xff0c;下面一起看看吧。 1. 常规 loading 实…

Linux系统之cuda 11情况下如何配置pytorch 10.2

由于目前pytorch1.8.2只能支持到10.2的版本&#xff0c;但ubuntu最新的系统驱动直接支持了cuda 11.4&#xff0c; 并且cuda tooklit支持的默认下载也是11.0。1、确认NVIDIA驱动安装lspci|grep NVIDIA1. 需要先降低cuda tooklit的版本(卸载新版本)cuda-uninstaller in /usr/loca…

统一附件存储MINIO部署使用

一、基于docker环境部署 1、创建docker-compose配置文件 1&#xff09;创建 docker-compose-minio.yml文件&#xff0c;内容如下&#xff1a; version: 3.7# Settings and configurations that are common for all containers x-minio-common: &minio-commonimage: quay…

结构体+枚举+联合体

目录 一、结构体的声明 &#xff08;一&#xff09;结构的基础知识 &#xff08;二&#xff09;结构的声明 &#xff08;三&#xff09;特殊的声明 &#xff08;四&#xff09;结构的自引用 1. 一个结构体内部包含一个类型为该结构本身的成员&#xff08;不合法&…

Day19 C++STL入门基础知识十一——map、multimap容器 构造赋值、大小交换、插入删除、查找统计、排序【全面深度剖析+例题代码展示】

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 ✍每日一句&#xff1a;【道固远&#xff0c;笃行可至&#xff1b;事虽巨&#xff0c;坚为必成】 文章目录1. 基本概念2. 构造赋值① 函数原型② 代码展示③ 测试结果3. 大小…

基于tensorflow的垃圾分类系统

项目描述 该项目基于PySide2和PyQt5设计界面UI&#xff0c;搭配QT Designer进行界面设计。 基于TensorFlow中的Keras模型&#xff0c;进行垃圾分类模型的训练。 项目包含功能有&#xff1a;使用者注册登录功能、管理员训练模型、用户使用模型进行分类。 功能介绍 一、注册登…

JVM调优

JVM调优-VisualVmVisualVm/ Jconsule远程连接第一种方式第二种方式&#xff1a;java 11开启远程GC连接如果还连不上考虑防火墙拦截了端口firewall-cmd --list-all,查看一下并暴露对应端口连接配置VisualVm界面简介采集GC信息的一些命令垃圾回收器切换VisualVm/ Jconsule远程连接…

unity 框选目标

先制作选框&#xff1a; 创建一个Image&#xff0c;给Sourece Image随便添加一张方形图片&#xff0c;如果添加圆的出来就是圆&#xff0c;这个看情况而定&#xff0c;然后勾掉Fill Center这样就镂空了 这种框选一般都是作为组件存在所以代码要做成单例类&#xff0c;默认情况…

【Mysql第十期 数据类型】

文章目录1. MySQL中的数据类型2.类型介绍2.2 可选属性2.2.2 UNSIGNED2.2.3 ZEROFILL2.3 适用场景2.4 如何选择&#xff1f;3. 浮点类型3.2 数据精度说明3.3 精度误差说明4. 定点数类型4.1 类型介绍4.2 开发中经验5. 位类型&#xff1a;BIT6. 日期与时间类型6.1 YEAR类型6.2 DAT…

程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #

编译与链接前言程序的环境程序的编译与链接写在最后前言 每当我们运行一段代码时&#xff0c;编译器都会自动的帮我们编译代码并将代码转换为一个二进制可执行文件&#xff08;.exe&#xff09;&#xff0c; 有了这个可执行文件&#xff0c;便可以执行我们写的程序了。那么编译…

Linux-Ubuntu18.04安装anaconda及python解释器环境的配置

1.anaconda的下载anaconda官网搜索链接&#xff0c;点击下载注意&#xff1a;anaconda的下载位置2.anaconda的安装利用如下命令进行安装&#xff1a;$ bash /home/xiaowang/下载/Anaconda3-2022.10-Linux-x86_64.sh一直点击回车enter&#xff0c;阅读文件内容文件阅读完毕&…

canal五部曲-如何保证消息的顺序

分析CanalRocketMQProducer.send canal发送消息到RocketMQ使用到了partitionNum、partitionHash 通过partitionHash可以把消息发送到RocketMQ的不同分区上&#xff0c;因为同一个分区在消费时有序的 public void send(final MQDestination destination, String topicName, com.…

2020年因果推断综述《A Survey on Causal Inference》

最近阅读了TKDD2020年的《A Survey on Causal Inference》&#xff0c;传送门&#xff0c;自己对文章按照顺序做了整理&#xff0c;同时对优秀的内容进行融合&#xff0c;如有不当之处&#xff0c;请多多指教。 文章对因果推理方法进行了全面的回顾&#xff0c;根据传统因果框…