在谈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。​

最新文章

  1. Problem of saving images in WPF (RenderTargetBitmap)zz
  2. ThinkPhP 分页
  3. pyhton 27 pip命令无法使用 没有Scripts文件夹 的解决方法
  4. rdesktop tsclient
  5. 关于 LimitedConcurrencyLevelTaskScheduler 的疑惑
  6. 学习笔记之Python
  7. MyBatis+Spring 事务管理
  8. Python - 字典(dict) 详解 及 代码
  9. Java--调试--单步调试,断言,单元测试
  10. hdu_2147_kiki&#39;s game(博弈)
  11. require.js疑惑
  12. SqlServer和Oracle中一些常用的sql语句3 行列转换
  13. NumPy基础练习(练一遍搞定NumPy)
  14. gulp不完全入门教程
  15. 鼠标事件以及clientX、offsetX、screenX、pageX、x的区别
  16. 前端使用crypto.js进行加密
  17. 错误 1 “Entities.PlanPrjEntity.PlanPrjs”不可访问,因为它受保护级别限制
  18. Code--POJ1850
  19. POJ3468 a simple problem with integers 分块
  20. Android Mms之:深入MMS支持

热门文章

  1. MySQL-5-TCL,视图,变量,存储过程和函数,流程控制
  2. SAP Grid control( ALV Grid 列表 自定义 按钮)
  3. XSS攻击(笔记)
  4. Task.Run(), Task.Factory.StartNew() 和 New Task() 的行为不一致分析
  5. Day01 对前端的初步了解
  6. dubbox 入门demo
  7. vue封装原生的可预览裁剪上传图片插件H5,PC端都可以使用
  8. Java学习第二周
  9. FastASR——PaddleSpeech的C++实现
  10. 多重分派(multiple dispatch)与访问者模式