再谈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。
再谈NULL和nullptr(C++11)区别的更多相关文章
- (转)null和NULL和nullptr和””区别
		
突然想到这个有趣的问题:C语言和C++对大小写是敏感的,也就是说null和NULL是区别对待的.NULL代表空地址,null只是一个符号.便来深究,看了很多资料,总结如下: 其实null和NULL都是 ...
 - 再谈多线程模型之生产者消费者(多生产者和多消费者 )(c++11实现)
		
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...
 - 再谈多线程模型之生产者消费者(多生产者和单一消费者 )(c++11实现)
		
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...
 - 再谈多线程模型之生产者消费者(单一生产者和多消费者  )(c++11实现)
		
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...
 - 再谈多线程模型之生产者消费者(基础概念)(c++11实现)
		
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现)[本文] 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生 ...
 - c++11编码规范 NULL还是nullptr
		
0和nullptr/NULL 至于指针(地址值),根据实际选择用0.NULL还是nullptr.对使用了C++11特性的项目,选用nullptr:对于C++03项目,推荐NULL,因为它像是一个指针
 - 浅谈HTTP中Get与Post的区别/HTTP协议与HTML表单(再谈GET与POST的区别)
		
HTTP协议与HTML表单(再谈GET与POST的区别) GET方式在request-line中传送数据:POST方式在request-line及request-body中均可以传送数据. http: ...
 - python之路--小数据池,再谈编码,is和 == 的区别
		
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
 - python-小数据池,再谈编码,is和 == 的区别
		
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
 
随机推荐
- 经典漏洞-后台备份数据库getshell
			
由于接触安全时间不多,一些老的getshell方法不是很清楚.这次碰到了个老站,正好学习了一下. 首先这边是用户名可以猜测出来的,因为输入错误的用户名显示用户名不存在,如果存在的话会显示密码错误. 爆 ...
 - 常见的git命令和git->github错误
			
相关命令 git remote git remote add origin xxx (xxx为仓库链接) 给这个链接取一个名字,为origin git pull git pull <远程主机名& ...
 - p_b_p_b 杂题选讲
			
[ARC119F] AtCoder Express 3 [ARC117F] Gateau 考虑二分答案,对前缀和建差分约束 \(\text{check}\) ,但是用 \(\text{spfa}\) ...
 - HashMap存储自定义类型键值和LinkedHashMap集合
			
HashMap存储自定义类型键值 1.当给HashMap中存放自定义对象时,如果自定义对象是键存在,保证键唯一,必须复写对象的hashCode和equals方法. 2.如果要保证map中存放的key和 ...
 - AI2(App Inventor 2) 离线版
			
介绍 我们的目标:搭建一个本地多用户的App Inventor 2 服务器目的:课堂教学,社团活动,兴趣学习优势:管理权限(用户管理,账号切换,资源打包),网络链接速度快,拥有配套服务.注意:每次退出 ...
 - nexus 配置文件到本地maven本地仓库 失败
			
Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on p ...
 - Grid属性太多记不住?【Grid栅格布局可视化编辑器】直观易懂高效,拖拉拽,有手就行!
			
手把手教你通过拖拉拽可视化的方式带你练习[Grid栅格布局]的各个属性,直观易懂!再也不愁记不住繁多的Grid属性了.整个过程在众触应用平台进行,不用手写一行CSS代码. grid-auto-flow ...
 - 基于ABP实现DDD--聚合和聚合根实践
			
在下面的例子中涉及Repository.Issue.Label.User这4个聚合根,接下来以Issue聚合为例进行分析,其中Issue聚合是由Issue[聚合根].Comment[实体].Iss ...
 - 5-8 Resource 静态资源服务器
			
静态资源服务器 什么是静态资源服务器 我们无论做什么项目,都会有一些页面中需要显示的静态资源,例如图片,视频文档等 我们一般会创建一个单独的项目,这个项目中保存静态资源 其他项目可以通过我们保存资源的 ...
 - 【docker专栏7】容器自启动与守护进程停止后容器保活
			
本文为大家介绍容器自启动以及docker 守护进程挂掉或者docker升级的情况下,如何保证容器服务的正常运行.主要包含三个部分 一.守护进程开机自启 在我们安装docker的时候,介绍过启动dock ...