再谈NULL和nullptr(C++11)区别

在谈NULL和nullptr区别之前,我们先看段代码:

#include "stdafx.h"
#include <iostream>using namespace std;
void func(void *p)
{cout << "p is pointer " << p << endl;
}
void func(int num)
{cout << "num is int " << num << endl;
}
int main(void)
{void *p = NULL;func(p);func(NULL);func(nullptr);return 0;
}

大家猜猜执行结果是怎样的?

func(NULL)执行结果是 num is  int 0,

翻开NULL的定义,可以看到

C语言里面:

#define NULL ((void*)0)

​C++里面,它是这样定义的:​

#define NULL    0

查看完整的定义:

/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else  /* __cplusplus */
#define NULL    ((void *)0)
#endif  /* __cplusplus */
#endif  /* NULL */

​C语言我们用NULL作为指针变量的初始值,而在C++一般不建议这么做,C++中,如果想表示空指针,建议使用nullptr,而不是NULL。​

​NULL具有二义性,为了解决这种二义性,C++11标准引入了关键字nullptr作为空指针常量。​

​我们开头的代码function(nullptr)会调用func(void*),因为nullptr隐式转换为指针类型,而无法隐式转换为整形,编译器会找到形参为指针的函数版本。nullptr的出现消除了0带来的二义性,类型和含义更加明确。实际使用过程中,建议在编译器支持的前提下优先使用nullptr。

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

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

相关文章

C/C++如何快速区分指针数组|数组指针|函数指针|指针函数

如何区分这些概念&#xff0c;主要还是看后面两个字&#xff0c;中文表达模式“​表语定性名词​”&#xff0c;​所以关键的都是后面的这个名词​&#xff1a; ​指针数组​&#xff1a;一个数组&#xff0c;数组元素是指针&#xff0c;如&#xff1a; int* p[20]; ​数组指…

Foxmail记事插入的表格怎么设置单元格边距

Foxmail在使用记事时候&#xff0c;插入了表格&#xff0c;该怎么设置单元格的边距呢?下面我们就来看看详细的教程。 Foxmail记事插入的表格怎么设置单元格边距? 1、下载并安装Foxmail邮件客户端。 Foxmail记事插入的表格怎么设置单元格边距? 2、打开Foxmail邮件客户端&…

C++11新特性探索:原始字符串字面值(raw string literal)

原始字符串字面值(raw string literal)是C11引入的新特性。 原始字符串简单来说&#xff0c;“原生的、不加处理的”&#xff0c;字符表示的就是自己&#xff08;所见即所得&#xff09;&#xff0c;引号、斜杠无需 “\” 转义&#xff0c;比如常用的目录表示&#xff0c;引入…

C++11新特性探究:显式override和final

C中&#xff0c;我们一般可以以基类声明纯虚函数&#xff0c;然后让派生类继承并重写这个虚函数&#xff0c;用​override表示显示覆盖基类方法&#xff0c;但一直没有提供一种方法来阻止派生类继承基类的虚函数。 C11标准引入了final说明符&#xff0c;很好的解决了上面的问题…

微信公众号小程序与服务号和订阅号有什么区别

微信中有小程序&#xff0c;有微信订阅号、微信服务号&#xff0c;这些功能之间有什么区别?下面我们就来详细介绍一下。 一、适合的场景 都是搭建在微信平台&#xff0c;功能、主要用途有些区别&#xff0c;使用不同的场景 微信公众号小程序与服务号和订阅号有什么区别? …

Android国标接入终端实现GB28181实时位置(MobilePosition)上报

技术背景 在实现本文提到的Android平台国标GB28181接入终端的实时位置上报之前&#xff0c;之前已经完成了Android终端GB28181常规功能接入&#xff0c;采集到实时音视频数据&#xff0c;编码PS打包后&#xff0c;按需传到GB28281服务平台&#xff0c;媒体流支持最新GB28181-2…

基于RTMP的智慧数字人|AI数字人传输技术方案探讨

技术背景 随着智慧数字人、AI数字人的兴起&#xff0c;越来越多的公司着手构建​全息、真实感数字角色等技术合成的数字仿真人虚拟形象&#xff0c;通过“虚拟形象语音交互&#xff08;T-T-S、ASR&#xff09;自然语言理解&#xff08;NLU&#xff09;深度学习”&#xff0c;构…

360手机助手游戏怎么实名认证 360手机助手下载的游戏怎么关了悬浮窗

360手机助手除了我们日常的传输文件&#xff0c;分享资源之外&#xff0c;上面还是有海量的游戏资源供我们下载的&#xff0c;而且平台还提供360币可以进行充值&#xff0c;不过很多小伙伴在下载游戏之后不知道在哪实名认证&#xff0c;哪里可以改实名认证?下面一起来看看。 …

​GB28181心跳机制探讨和技术实现

​GB/T 28181-2016心跳机制​ ​通过周期性的状态信息报送&#xff0c;实现注册服务器与源设备之间的状态检测即心跳机制。 ​ ​心跳发送方、接收方需统一配置“心跳间隔”参数&#xff0c;按照“心跳间隔”定时发送心跳消息&#xff0c;默认心跳间隔60s。心跳发送方、接收方…

Win7系统电脑怎么设置桌面壁纸全屏显示

我们在使用电脑的时候经常会进行一些个性化的设置。电脑桌面壁纸肯定是许多小伙伴最先更改的个性化设置之一。但是有许多小伙伴发现自己的win7电脑在更换壁纸的时候&#xff0c;图像显示过小&#xff0c;没有办法全屏显示&#xff0c;Win7系统电脑怎么设置桌面壁纸全屏显示?下…

Unity3D下Linux平台播放RTSP或RTMP流

背景 尽管Windows平台有诸多优势&#xff0c;Linux平台的发展还是势不可挡&#xff0c;特别实在传统行业&#xff0c;然而Linux生态构建&#xff0c;总是差点意思&#xff0c;特别是有些常用的组件&#xff0c;本文基于已有的Linux平台RTSP、RTMP播放模块&#xff0c;构建Unit…

std::jthread与std::thread区别

​std::jthread是C20新引入的线程类&#xff0c;与 std::thread 类似&#xff0c;或者说&#xff0c;jthread是对thread进一步的封装&#xff0c;功能更强大​。 ​std::jthread的​j实际上是​joining的缩写​&#xff0c;​众所周知&#xff0c;std::thread在其生命周期结束…

Win11如何调整任务栏大小 Win11调整任务栏大小的方法

现在已经有很多小伙伴都已经安装Win11系统进行体验了&#xff0c;但有一些小伙伴在体验的时候想要更改任务栏大小却不知道如何操作&#xff0c;那么碰到这种问题应该怎么办呢?下面就和小编一起来看看有什么解决方法吧。 Win11调整任务栏大小的方法 1、win11的任务栏大小&…

Unity3D平台实现全景实时RTMP|RTSP流渲染

好多开发者的使用场景&#xff0c;需要在Windows特别是Android平台实现Unity3D的全景实时视频渲染&#xff0c;本文以Windows平台为例&#xff0c;简单介绍下具体实现&#xff1a; 如果是RTSP或RTMP流数据&#xff0c;实际上难点&#xff0c;主要在于拉取RTSP或RTMP流&#xf…

C++17新特性之std::string_view

std::string_view系C17标准发布后新增的内容&#xff0c;类成员变量包含两个部分&#xff1a;字符串指针和字符串长度&#xff0c;相比std::string, std::string_view涵盖了std::string的所有只读接口。如果生成的std::string无需进行修改操作&#xff0c;可以把std::string转换…

谷歌浏览器该扩展程序未列在Chrome网上应用店中解决方法

很多用户在谷歌浏览器中安装扩展程序的时候会发现有些扩展程序安装后会显示红字“该扩展程序未列在Chrome网上应用店中”&#xff0c;然后插件未能正常启用&#xff0c;这让其很是苦恼&#xff0c;那么下面就来说一下如何解决这类插件安装的问题。 谷歌浏览器该扩展程序未列在…

Android平台实现RTSP|RTMP转GB28181网关接入

背景 在事先Android平台RTSP、RTMP转GB28181网关之前&#xff0c;我们已经实现了Android平台GB28181的接入&#xff0c;可实现Android平台采集到的音视频数据&#xff0c;编码后&#xff0c;打包按需发到GB28181服务平台。此外&#xff0c;拉流端&#xff0c;我们已经有了成熟…

一句话解释C++指针和引用区别

记住一句话就够了&#xff1a;指针三心二意&#xff0c;引用从一而终&#xff01; 指针是一个实体&#xff0c;而引用可理解为一个别名&#xff1b; ”sizeof(指针)”得到的是指针本身的大小&#xff0c;”sizeof(引用)”返回所指向的变量(对象)的大小。 引用一定不为空&…

大地Win11 64位全新专业版系统V2021.08

大地Win11 64位全新专业版系统V2021.08以微软官方原版作为母盘对系统进行了全面优化更新&#xff0c;用户使用更加流畅顺手&#xff0c;轻松体验到系统的优秀性能&#xff0c;适用目前市场最新机型以及老旧机型&#xff0c;多种安装方式供用户选择&#xff0c;且更新时间短无需…

Unity3D下实现Linux平台RTMP推流(以采集Unity窗体和声音为例)

技术背景 随着物联网等行业的崛起&#xff0c;越来越多的传统行业如虚拟仿真、航天工业、工业仿真、城市规划等&#xff0c;对Linux下的生态构建&#xff0c;有了更大的期望&#xff0c;Linux平台下&#xff0c;可选的直播推拉流解决方案相对Windows和移动端&#xff0c;非常少…