【知识点】nullptr 和 NULL

2024-06-10 12:36
文章标签 知识点 nullptr null

本文主要是介绍【知识点】nullptr 和 NULL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 C++ 中,nullptrNULL 都可以用来表示空指针,但是它们之间有一些重要的区别。这些区别涉及到类型安全性、代码可读性和在不同版本的 C++ 中的使用情况。

NULL

NULL 是一个宏,通常定义为 0(void*)0,它最初是在 C 语言中引入的,用于表示空指针。在 C++ 中,NULL 继续沿用,但是它有一些缺陷:

  • 类型不安全NULL 实际上是一个整数常量 0,这意味着在需要指针的地方使用 NULL 可能会引起类型不安全的问题。例如,可以将 NULL 赋值给整型变量而不会有编译错误。
  • 代码可读性差NULL 宏没有明确表示它是一个空指针,这可能会导致代码的可读性下降。
示例
int* ptr1 = NULL;  // 正确,ptr1 是一个空指针
int val = NULL;    // 编译器不会报错,但逻辑上是错误的,因为 NULL 实际上是 0

nullptr

nullptr 是在 C++11 中引入的关键字,用于表示空指针。nullptr 有以下优点:

  • 类型安全nullptr 是一个指针类型,而不是整数类型。这使得它在上下文中更清晰地表示空指针,避免了类型不安全的问题。
  • 更好的代码可读性nullptr 明确表示空指针,增强了代码的可读性和可维护性。
示例
int* ptr2 = nullptr;  // 正确,ptr2 是一个空指针
int val = nullptr;    // 编译错误,nullptr 不能赋值给整数类型

区别总结

  1. 类型

    • NULL 是一个整数常量(通常为 0)。
    • nullptr 是一个类型安全的空指针。
  2. 类型安全

    • NULL 可能导致类型不安全的问题,因为它是一个整数。
    • nullptr 是类型安全的,只能用于指针类型。
  3. 代码可读性

    • NULL 的含义不如 nullptr 直观,特别是在大型代码库中。
    • nullptr 明确表示空指针,代码可读性更高。
  4. 编译器支持

    • NULL 在 C 和 C++ 中都可以使用。
    • nullptr 仅在 C++11 及更高版本中支持。

示例对比

#include <iostream>void foo(int* ptr) {if (ptr == nullptr) {std::cout << "ptr is a null pointer" << std::endl;} else {std::cout << "ptr is not a null pointer" << std::endl;}
}void bar(int value) {std::cout << "value is " << value << std::endl;
}int main() {int* p1 = NULL;     // p1 是一个空指针int* p2 = nullptr;  // p2 也是一个空指针foo(p1);  // 输出:ptr is a null pointerfoo(p2);  // 输出:ptr is a null pointerbar(NULL);     // 编译通过,但逻辑上错误,因为 NULL 是 0// bar(nullptr); // 编译错误,nullptr 不能赋值给整数return 0;
}

在这个示例中,foo 函数可以使用 NULLnullptr 进行调用,而 bar 函数在使用 nullptr 调用时会导致编译错误,从而防止了类型不安全的问题。

总结

尽管 NULLnullptr 都可以表示空指针,但 nullptr 更安全且更具可读性。为了编写现代且类型安全的 C++ 代码,建议在可能的情况下使用 nullptr 代替 NULL

这篇关于【知识点】nullptr 和 NULL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

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

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

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

枚举相关知识点

1.是用户定义的数据类型,为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误,在编译期间可检查错误。 3.enum定义的枚举类有什么特点。         a.定义的enum类型总是继承自java.lang.Enum,且不能被继承,因为enum被编译器编译为final修饰的类。         b.只能定义