【知识点】nullptr 和 NULL

在 C++ 中,nullptrNULL 都可以用来表示空指针,但是它们之间有一些重要的区别。这些区别涉及到类型安全性、代码可读性和在不同版本的 C++ 中的使用情况。

NULL

NULL 是一个宏,通常定义为 0(void*)0,它最初是在 C 语言中引入的,用于表示空指针。在 C++ 中,NULL 继续沿用,但是它有一些缺陷:

  • 类型不安全NULL 实际上是一个整数常量 0,这意味着在需要指针的地方使用 NULL 可能会引起类型不安全的问题。例如,可以将 NULL 赋值给整型变量而不会有编译错误。
  • 代码可读性差NULL 宏没有明确表示它是一个空指针,这可能会导致代码的可读性下降。
示例
int* ptr1 = NULL;  // 正确,ptr1 是一个空指针
int val = NULL;    // 编译器不会报错,但逻辑上是错误的,因为 NULL 实际上是 0

nullptr

nullptr 是在 C++11 中引入的关键字,用于表示空指针。nullptr 有以下优点:

  • 类型安全nullptr 是一个指针类型,而不是整数类型。这使得它在上下文中更清晰地表示空指针,避免了类型不安全的问题。
  • 更好的代码可读性nullptr 明确表示空指针,增强了代码的可读性和可维护性。
示例
int* ptr2 = nullptr;  // 正确,ptr2 是一个空指针
int val = nullptr;    // 编译错误,nullptr 不能赋值给整数类型

区别总结

  1. 类型

    • NULL 是一个整数常量(通常为 0)。
    • nullptr 是一个类型安全的空指针。
  2. 类型安全

    • NULL 可能导致类型不安全的问题,因为它是一个整数。
    • nullptr 是类型安全的,只能用于指针类型。
  3. 代码可读性

    • NULL 的含义不如 nullptr 直观,特别是在大型代码库中。
    • nullptr 明确表示空指针,代码可读性更高。
  4. 编译器支持

    • NULL 在 C 和 C++ 中都可以使用。
    • nullptr 仅在 C++11 及更高版本中支持。

示例对比

#include <iostream>void foo(int* ptr) {if (ptr == nullptr) {std::cout << "ptr is a null pointer" << std::endl;} else {std::cout << "ptr is not a null pointer" << std::endl;}
}void bar(int value) {std::cout << "value is " << value << std::endl;
}int main() {int* p1 = NULL;     // p1 是一个空指针int* p2 = nullptr;  // p2 也是一个空指针foo(p1);  // 输出:ptr is a null pointerfoo(p2);  // 输出:ptr is a null pointerbar(NULL);     // 编译通过,但逻辑上错误,因为 NULL 是 0// bar(nullptr); // 编译错误,nullptr 不能赋值给整数return 0;
}

在这个示例中,foo 函数可以使用 NULLnullptr 进行调用,而 bar 函数在使用 nullptr 调用时会导致编译错误,从而防止了类型不安全的问题。

总结

尽管 NULLnullptr 都可以表示空指针,但 nullptr 更安全且更具可读性。为了编写现代且类型安全的 C++ 代码,建议在可能的情况下使用 nullptr 代替 NULL

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

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

相关文章

vmware-17虚拟机安装教程,安装linux centos系统

下载VMware 1.进入VMware官网&#xff1a;https://www.vmware.com/sg/products/workstation-pro.html 2.向下翻找到&#xff0c;如下界面并点击“现在安装” 因官网更新页面出现误差&#xff0c;现提供vmware17安装包网盘链接如下&#xff1a; 链接&#xff1a;https://pan.b…

Vue17-条件渲染

一、使用v-show属性做条件渲染 控制元素的显示和隐藏 v-show里面也能是表达式&#xff0c;只要表达式的值是boolean就行。 或者 当时结构还在&#xff1a; 二、使用v-if属性做条件渲染 结构也不在了 三、示例 方式一&#xff1a; 方式二&#xff1a; 当元素有很高的切换频率&am…

从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(四)

上一章节我们了解了 shuffle 相关的概念和原理后其实可以发现一个问题&#xff0c;那就是 shuffle 比较容易造成数据倾斜的情况。 例如上一节我们看到的图&#xff0c;在这批数据中&#xff0c;hello 这个单词的行占据了绝大部分&#xff0c;当我们执行 groupByKey 的时候触发了…

刚刚❗️德勤2025校招暑期实习测评笔试SHL测评题库已发(答案)

&#x1f4e3;德勤 2024暑期实习测评已发&#xff0c;正在申请的小伙伴看过来哦&#x1f440; ㊙️本次暑期实习优先考虑2025年本科及以上学历的毕业生&#xff0c;此次只有“审计及鉴定”“税务与商务咨询”两个部门开放了岗位~ ⚠️测评注意事项&#xff1a; &#x1f44…

pdf分割为bmp

import fitz # PyMuPDF import os from PIL import Imagedef convert_pdf_to_bmp(pdf_path, output_folder):"""将单个PDF文件的每一页转换为BMP格式的图像。:param pdf_path: PDF文件的路径。:param output_folder: 保存BMP图像的输出文件夹路径。""…

简单了解java中的正则表达式

正则表达式 1、正则表达式认识 正则表达式通常用来校验&#xff0c;检查字符串是否符合规则&#xff0c;由一些特定的字符组成的字符串校验规则&#xff0c;就称之为正则表达式。 2、正则表达式能干啥&#xff1f; 正则表达式只能针对字符串格式进行校验&#xff0c;所以它…

使用Nextjs学习(学习+项目完整版本)

创建项目 运行如下命令 npx create-next-app next-create创建项目中出现的各种提示直接走默认的就行,一直回车就行了 创建完成后进入到项目运行localhost:3000访问页面,如果和我下面页面一样就是创建项目成功了 整理项目 将app/globals.css里面的样式都删除,只留下最上面三…

独孤思维:副业圈很多骗子

01 副业圈鱼龙混杂&#xff0c;别没事和别人撕b。 不认可就退群&#xff0c;取关。 和一个垃圾人互怼&#xff0c;爆粗口&#xff0c;耗费的是自己的体力和时间。 结果也只会一地鸡毛&#xff0c;得不偿失。 专注&#xff0c;只服务于认可你的人&#xff0c;只付费你认可的…

C#面:什么是DLL文件,使用它们有什么好处

在C#中&#xff0c;DLL&#xff08;Dynamic Link Library&#xff09;文件是一种可重用的代码库&#xff0c;它包含了已编译的函数、类、数据和资源。DLL文件可以被多个应用程序共享和重用&#xff0c;这样可以提高代码的复用性和可维护性。 使用DLL文件有以下几个好处&#x…

【LeetCode算法】第112题:路径总和

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;二叉树先序遍历。首先访问根节点&#xff0c;若根节点是叶子节点并且值等于目标值&#xff0c;则返回true&#xff0c;否则递归访问左子树和右子树&#xff0c;只要左…

TCP/UDP的区别

首先来介绍一下什么是TCP和UDP TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是互联网协议套件中两个重要的传输层协议。它们在数据传输的方式、可靠性、连接性等方面有显著的区别。 总之他们两个就是个协议&#xff0c;协议也就是数…

PG 数据库常用参数调整

1.shard_buffers Postgresql使用自己的缓冲区,也使用操作系统缓冲区。这意味着数据存储在内存中两次,首先是 Postgresql缓冲区,然后是操作系统缓冲区。 与其他数据库不同, Postgresql不提供直接IO。这称为双缓冲&#xff08;就是磁盘中的时候读的时候先放在数据库的缓冲区&am…

【上下界分析 差分数组】798得分最高的最小轮调

本文涉及知识点 差分数组 本题同解 C算法前缀和的应用&#xff1a;798得分最高的最小轮调 LeetCode798得分最高的最小轮调 给你一个数组 nums&#xff0c;我们可以将它按一个非负整数 k 进行轮调&#xff0c;这样可以使数组变为 [nums[k], nums[k 1], … nums[nums.lengt…

leetcode168:Excel表列名称

题目链接&#xff1a;168. Excel表列名称 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string convertToTitle(int columnNumber) {string ss1;int MOD 0;if(columnNumber < 26){ss1 (columnNumber A - 1);return ss1;}while(columnNumber){int MO…

Web学习_SQL注入_布尔盲注

盲注就是在SQL注入过程中&#xff0c;SQL语句执行后&#xff0c;查询到的数据不能 回显到前端页面。此时&#xff0c;我们需要利用一些方法进行判断或者尝 试&#xff0c;这个过程称之为盲注。而布尔盲注就是SQL语句执行后&#xff0c;页面 不返回具体数据&#xff0c;数据库只…

【AIGC调研系列】chatTTS与GPT-SoVITS的对比优劣势

ChatTTS和GPT-SoVITS都是在文本转语音&#xff08;TTS&#xff09;领域的重要开源项目&#xff0c;但它们各自有不同的优势和劣势。 ChatTTS 优点&#xff1a; 多语言支持&#xff1a;ChatTTS支持中英文&#xff0c;并且能够生成高质量、自然流畅的对话语音[4][10][13]。细粒…

未卸载干净的proteus安装教程7.8

提醒&#xff1a; 针对第一次安装推荐博文&#xff1a;https://jingyan.baidu.com/article/656db918f8590de381249cbf.html 1、一定要以管理员身份运行软件。 2、以管理员身份运行软件后&#xff0c;默认的ISIS Professional路径是C:\Program Files \Labcenter Electronics\…

802.11漫游流程简单解析与笔记_Part1

最近在进行和802.11漫游有关的工作&#xff0c;需要对wpa_supplicant认证流程和漫游过程有更多的了解&#xff0c;所以通过阅读论文等方式&#xff0c;记录整理漫游相关知识。Part1将记录802.11漫游的基本流程、802.11R的基本流程、与认证和漫游都有关的三层秘钥基础。Part1将包…

Excel行列条件转换问题,怎么实现如图一到图二的效果?

图一 图二 如果数据比较&#xff0c;不建议一上来就用公式&#xff0c;风速值那一列的数据可以确定都是数值型数字&#xff0c;可以先试试用数据透视表做转换工具&#xff1a; 1.创建数据透视表 将采集时间放在行字段&#xff0c;测风放在列字段&#xff0c;风速放在值字段 2.…