指针空值nullptr(C++11)

news2025/4/27 18:21:37
在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现
不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下
方式对其进行初始化:
void TestPtr()
{
int* p1 = NULL;
int* p2 = 0;
// ……
}
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif
         可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦
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;
}

        程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
        在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。
注意:
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的

2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

        为何不改null?

因为语言的发展要向前兼容,比如有人之前已经用一些可能有bug的语法写过代码,为了保证别人的代码还能够正常运行,bug可以补救,但是不要修改先前有的语法

 

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

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

相关文章

【Docker 02】docker镜像和容器命令大全

对于入门学习者,更推荐的方式是通过官网的Reffrence手册,学习使用命令,不仅存在用法,选项参数的解释,还有用力example。 docker命令的基本语法结构: docker 子命令 [选项] [参数] 一、Docker基本命令 1.镜像有关 一批模板文件,不同的镜像可以包含的环境内容是不一样的,…

深入了解多线程原理

目录 背景知识&#xff1a; 什么是进程&#xff1f; 什么是线程&#xff1f; 线程与进程的区别&#xff1a; Thread类及常用方法&#xff1a; 循环打印的例子&#xff1a; start() 和 run() 的区别&#xff1a; 通过监视窗口查看线程&#xff1a; 创建线程&#xff1a; 1.继承 …

console控制台有sql语句输出但log文件中不输出sql解决方式

控制台可以输出sql&#xff0c;但是log文件中无sql输出&#xff0c;如何解决&#xff1f;把握两点就可以输出&#xff1a;第一点&#xff0c;mybatis 本身的logImpl配置这个参数是配置mybatis所使用的日志框架&#xff0c;取值范围如下&#xff1a;SLF4JLOG4J #表示使用LOG4J作…

提名倒计时! | 2022 龙蜥社区优秀贡献者

各位盆友们&#xff1a;2022 年&#xff0c;那些为龙蜥壮大做出杰出贡献的人们&#xff0c;包括开源背后的推动者、组织者、布道者、代码贡献者&#xff0c;让我们看到了热爱技术的力量&#xff01;为此社区推出「2022 龙蜥社区优秀贡献者」活动。截至目前&#xff0c;距离报名…

CSAPP Malloc Lab

CSAPP Malloc Lab 在这个实验室中&#xff0c;您将为C程序编写一个动态存储分配器&#xff0c;即您自己版本的malloc、free和realloc例程&#xff0c;实现一个正确&#xff0c;高效和快速的分配器。本实验性能指标有两个方面&#xff0c;内存利用率和吞吐量&#xff0c;这两个…

fpga图像处理(基于camera的图像读取和显示)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 市面上目前很多的fpga开发板都有camera到lcd的显示demo。处理流程也是很相似的。一般的流程都是fpga首先初始化cmos,接着就是把数据从cmos读出来存储到sdram里面,显示模块再从sdra…

C语言高级教程-C语言数组(六):变长数组

C语言高级教程-C语言数组&#xff08;六&#xff09;&#xff1a;变长数组一、本文的编译环境二、一维数组在执行期间确定长度三、二维数组在执行期间确定长度四、一维变长数组实例五、完整程序5.1 Main.h 文件程序5.2 Main.c 文件程序六、总结一、本文的编译环境 本文的编译环…

压缩包版本快速安装MySQL教程

安装MySQL 跟随老师 狂神学java 学习地址 bilibilihttps://www.bilibili.com/video/BV1NJ411J79W?p1&vd_source69de4cea8c2ffc0f520876695f09a2da 这里建议大家使用压缩版 , 安装快 , 方便 . 不复杂 . 1、软件下载mysql5.7 64位下载地址: https://dev.mysql.com/get/Dow…

数据治理与IT治理的关系

前面我们辨析了数据治理的概念。这一篇文章要讲数据治理与IT治理的关系&#xff0c;首先来看看IT治理的概念。IT治理的理念最早是IBM&#xff08;InternationalBusiness Machines Corporation&#xff0c;国际商业机器公司&#xff09;引入中国的&#xff0c;属于公司治理的一部…

中金公司:全面注册制监管规则解读(附97页报告原文pdf下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年12月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿推荐技术在vivo互联网商业化业务中的实践.pdf2023年&#xff0c;如何科学制定年度规划&a…

Spring Batch 批处理数据表

目录 引言 概述 batch_job_instance表 batch_job_execution表 batch_job_execution_context表 batch_job_execution_params表 btch_step_execution表 batch_step_execution_context表 H2内存数据库 转视频版 引言 接着上篇&#xff1a;Spring Batch 步骤对象-返回状…

MybatisPlus多表查询之零sql编写实现

1.前言 年初节奏还没有快起来&#xff0c;适合做做技术前瞻&#xff0c;无论是对个人还是团队都是好事。真要说分享&#xff0c;其实感觉也没啥好分享的&#xff0c;就像接手新项目一样&#xff0c;代码都是自己看&#xff0c;别人讲的再多&#xff0c;不看&#xff0c;不用&am…

OpenMP For Construct dynamic 调度方式实现原理和源码分析

OpenMP For Construct dynamic 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍 OpenMp for construct 的实现原理&#xff0c;以及与他相关的动态库函数分析&#xff0c;与 for construct 非常相关的是循环的调度方式&#xff0c;在 OpenMP 当中一共有四种调…

KVM,QEMU与libvirt关系

KVM&#xff1a;负责cpu虚拟化内存虚拟化&#xff0c;实现了cpu和内存的虚拟化&#xff0c;但kvm不能模拟其他设备&#xff1b;KVM是linux内核的模块&#xff0c;它需要CPU的支持&#xff0c;采用硬件辅助虚拟化技术Intel-VT&#xff0c;AMD-V&#xff0c;内存的相关如Intel的E…

FPGA纯verilog代码实现8位精简指令集CPU,一学期的微机原理不如看懂这套代码,提供工程源码和技术支持

目录1、前言2、设计思想和架构3、硬件组成讲解4、vivado仿真5、vivado工程6、上板调试验证7、福利&#xff1a;工程源码获取1、前言 本文章主要针对大学本科阶段学生&#xff1b; 读文章之前先来几个灵魂拷问&#xff1a; 1、你是否学过《微机原理》、《单片机》、《汇编语言》…

怎样做一个优秀的程序员?这10个问题ChatGPT这样说 ……

本文目录 1 怎样做一个优秀的程序员? 2 怎样成为优秀的架构师? 3 怎样写容易阅读的代码? 4 怎样做项目管理? 5 怎样学习计算机程序设计? 6 怎样提升个人影响力? 7 怎样提升认知? 8 程序员怎样面试通过几率高? 9 怎样提升研发效能? 10 怎样保障软件系统的稳定…

字体图标的使用【购物车】

方法1 <link rel"stylesheet" href"2购物车/iconfont.css"><style>*{padding: 0;margin: 0;}li{width: 90px;height: 40px;background-color: pink;margin: 0 auto; list-style: none;text-align: center;line-height: 40px;}a{text-decoratio…

4.6 Python元组

列表非常适合用于存储在程序运行期间可能变化的数据集。Python将不能修改的值称为不可变的&#xff0c;而不可变的列表被称为元组。4.5.1 定义元组元组看起来犹如列表&#xff0c;但使用圆括号而不是方括号来标识。定义元组后&#xff0c;就可以使用索引来访问其元素&#xff0…

vue3组件库项目学习笔记(七):正式开发问题拾遗

目前组件库的开发还在进行中&#xff0c;这里把一些开发过程中遇到的问题和解决方案总结一下&#xff0c;也方便后续开发的同学踩坑了可以马上解决问题&#xff0c;这期的问题主要是&#xff1a; 多项目开发的配置文件优化和全局导入方法的修改怎么样使用 icon 组件怎么样使用…

git-学习git,这一篇就足够了(初学者视角实战教程)

目录git概念命令git配置README.gitignore工作区、暂存区和版本库基础配置创建远程仓库克隆修改查看工作区当前状态添加到暂存区回退版本比较工作区与缓存区的差异添加到本地仓库并加注释push提高git pull文件删除与恢复分支管理列出分支创建分支切换分支分支操作标签管理创建标…