NULL和nullptr到底是什么?它们的区别又是什么?

目录

1.前言

2.剖析NULL

3. 剖析nullptr

4.nullptr与NULL的区别


1.前言

为了保持良好的编程习惯,我们在声明某个变量时都应该给这个变量合适的初始值,不然容易出现不可预知的错误。对于指针来说更是如此,在c语言中我们就通常将暂时没有指向的指针置为NULL.

2.剖析NULL

NULL 是一个宏,通常被用来表示空指针。在C和C++的早期版本中,NULL 通常被定义为0或者((void*)0),用于表示一个无效或未初始化的指针。

在传统的C头文件(stddef.h)中,可以看到如下代码

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。

3. 剖析nullptr

nullptr 是 C++11 标准引入的新关键字,具有独立的类型 std::nullptr_t,用于表示空指针,不能被隐式转换为其他类型(nullptr本身就是一个唯一的类型)。它是为了解决使用 NULL 宏在某些情况下可能导致的类型不明确、歧义或安全性问题而引入的。

4.nullptr与NULL的区别

下面是 nullptrNULL 的主要区别:

  1. 类型安全:

    • nullptr 是一个特殊的空指针常量,具有独立的类型 std::nullptr_t。这使得 nullptr 在类型安全性方面更可靠,因为它不能被隐式转换为其他类型。
    • NULL 实际上是一个宏,通常被定义为 0((void*)0)。因此,NULL 在一些情况下可能会发生隐式类型转换,导致潜在的问题。
  2. 可读性:

    • nullptr 更加明确地表示空指针的概念,使代码更易读,更容易理解。
    • NULL 可能在某些上下文中引起歧义,因为它只是一个宏,其实际值可以是 0 或其它。
  3. 重载决议:

    • 如果一个函数有重载版本,其中一个接受指针类型的参数,使用 nullptr 可以避免重载决议的歧义问题。因为 nullptr 有独立的类型,可以更容易地选择正确的重载版本。
    • NULL 在某些情况下可能导致重载决议的不确定性。

nullptr与NULL的区别同样也是nullptr的优势,在日常编程中我们也应当多使用nullptr.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/470151.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

挑战杯 python区块链实现 - proof of work工作量证明共识算法

文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…

9 个管理 Windows 硬盘的最佳免费磁盘分区软件 [2024 排名]

管理分区可能是一项具有挑战性的任务。当您想到删除、缩小、移动、磁盘分区或合并分区等方面时,您会认为它们是很难做到的事情。然而,虽然 Windows 自己的磁盘管理可以处理大部分问题,但它无法处理管理分区的所有方面。 这时候优质的磁盘管理…

【Cocos入门】物理检测

目录 一、物理检测的概念二、点测试三、矩形测试四、射线测试 一、物理检测的概念 CoCos中,物理检测也是物理系统的一部分,它不是用于检测物体的物理特性的,而是用来查询物体的(比如某个地方是否存在物理碰撞体)。其又分成:点检测…

关于VIT(Vision Transformer)的架构记录

在VIT模型设计中,尽可能地紧密遵循原始的Transformer模型(Vaswani等人,2017年)。这种刻意简化的设置的一个优势是,可扩展的NLP Transformer架构及其高效的实现几乎可以即插即用。 图:模型概述。我们将图像分…

「优选算法刷题」:和可被K整除的子数组

一、题目 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1: 输入:nums [4,5,0,-2,-3,1], k 5 输出:7 解释&…

《合成孔径雷达成像算法与实现》Figure6.13

clc clear close all参数设置 距离向参数设置 R_eta_c = 20e3; % 景中心斜距 Tr = 2.5e-6; % 发射脉冲时宽 Kr = 20e12; % 距离向调频率 alpha_os_r = 1.2; % 距离过采样率 Nrg = 320; % 距离线采样数 …

多模态基础---BERT

1. BERT简介 BERT用于将一个输入的句子转换为word_embedding,本质上是一个transformer的Encoder。 1.1 BERT的两种训练方法 预测被遮挡的单词预测两个句子是否是相邻的句子 1和2是同时训练的 1.1 BERT的四种用法 预测句子的类别:输入一个句子&…

鸿蒙开发系列教程(二十一)--轮播处理

轮播处理 Swiper本身是一个容器组件,当设置了多个子组件后,可以对这些子组件进行轮播显示 在自身尺寸属性未被设置时,会自动根据子组件的大小设置自身的尺寸 参数: 通过loop属性控制是否循环播放,该属性默认值为tr…

【深入理解DETR】DETR的原理与算法实现

1 DETR算法概述 ①端到端 ②Transformer-model 之前的方法都需要进行NMS操作去掉冗余的bounding box或者手工设计anchor, 这就需要了解先验知识,增加从超参数anchor的数量, 1.1 训练测试框架 一次从图像中预测n个object的类别 训练阶段我们…

【C语言】指针练习篇(下),深入理解指针---指针练习题【图文讲解,详细解答】

欢迎来CILMY23的博客喔,本期系列为【C语言】指针练习篇(下),深入理解指针---指针练习题【图文讲解,详细解答】,图文讲解指针练习题,带大家更深刻理解指针的应用,感谢观看,支持的可以…

企业计算机服务器中了mkp勒索病毒怎么办?Mkp勒索病毒解密处理

随着网络技术的不断发展,企业的生产运营也加大了步伐,网络为企业的生产运营提供了强有力保障,但网络是一把双刃剑,给企业带来便利的同时也为企业带来了严重的数据威胁。春节期间,云天数据恢复中心接到很多企业的值班人…

CCF编程能力等级认证GESP—C++2级—20231209

CCF编程能力等级认证GESP—C2级—20231209 单选题(每题 2 分,共 30 分)判断题(每题 2 分,共 20 分)编程题 (每题 25 分,共 50 分)小杨做题小杨的 H 字矩阵 参考答案单选题判断题编程题1编程题2 …