NULL和nullptr到底是什么?它们的区别又是什么?

2024-02-16 01:52
文章标签 区别 到底 nullptr null

本文主要是介绍NULL和nullptr到底是什么?它们的区别又是什么?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.前言

2.剖析NULL

3. 剖析nullptr

4.nullptr与NULL的区别


1.前言

为了保持良好的编程习惯,我们在声明某个变量时都应该给这个变量合适的初始值,不然容易出现不可预知的错误。对于指针来说更是如此,在c语言中我们就通常将暂时没有指向的指针置为NULL.

2.剖析NULL

NULL 是一个宏,通常被用来表示空指针。在C和C++的早期版本中,NULL 通常被定义为0或者((void*)0),用于表示一个无效或未初始化的指针。

在传统的C头文件(stddef.h)中,可以看到如下代码

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。

3. 剖析nullptr

nullptr 是 C++11 标准引入的新关键字,具有独立的类型 std::nullptr_t,用于表示空指针,不能被隐式转换为其他类型(nullptr本身就是一个唯一的类型)。它是为了解决使用 NULL 宏在某些情况下可能导致的类型不明确、歧义或安全性问题而引入的。

4.nullptr与NULL的区别

下面是 nullptrNULL 的主要区别:

  1. 类型安全:

    • nullptr 是一个特殊的空指针常量,具有独立的类型 std::nullptr_t。这使得 nullptr 在类型安全性方面更可靠,因为它不能被隐式转换为其他类型。
    • NULL 实际上是一个宏,通常被定义为 0((void*)0)。因此,NULL 在一些情况下可能会发生隐式类型转换,导致潜在的问题。
  2. 可读性:

    • nullptr 更加明确地表示空指针的概念,使代码更易读,更容易理解。
    • NULL 可能在某些上下文中引起歧义,因为它只是一个宏,其实际值可以是 0 或其它。
  3. 重载决议:

    • 如果一个函数有重载版本,其中一个接受指针类型的参数,使用 nullptr 可以避免重载决议的歧义问题。因为 nullptr 有独立的类型,可以更容易地选择正确的重载版本。
    • NULL 在某些情况下可能导致重载决议的不确定性。

nullptr与NULL的区别同样也是nullptr的优势,在日常编程中我们也应当多使用nullptr.

这篇关于NULL和nullptr到底是什么?它们的区别又是什么?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/713165

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

Python中@classmethod和@staticmethod的区别

《Python中@classmethod和@staticmethod的区别》本文主要介绍了Python中@classmethod和@staticmethod的区别,文中通过示例代码介绍的非常详细,对大... 目录1.@classmethod2.@staticmethod3.例子1.@classmethod

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

Python中json文件和jsonl文件的区别小结

《Python中json文件和jsonl文件的区别小结》本文主要介绍了JSON和JSONL两种文件格式的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 众所周知,jsON 文件是使用php JSON(JavaScripythonpt Object No

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的