【C/C++】关键字nullptr详解 | NULL与nullptr的区别

文章介绍了C++中的nullptr关键字,作为代替旧版NULL的空指针表示。nullptr的引入解决了在函数重载时NULL(宏定义为0)可能导致的类型歧义问题,提高了程序的类型安全性和可读性。文章详细讨论了nullptr与NULL的本质区别,以及在编程中的正确使用场景。
该文章已生成可运行项目,

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


一、nullptr介绍✧

在C++中,引入了一个新的关键字——nullptr,用来代替旧版本的NULL

nullptr用于代表空指针,对于指针初始化时使用如下:

	int* p1 = nullptr;   //关键字,代表空指针

之前用指针指向的new出来的堆空间,在回收时就可以将指针指向nullptr

	int** p = new int*;
	free(p);
	p=nullptr;

既然nullptr与之前的NULL使用的方法一致,为什么还要引入nullptr关键字?

在这里插入图片描述

二、为什么需要nullptr ?

在学过【C/C++】函数重载的知识后,我们就能理解为什么需要nullptr关键字用来代替NULL宏定义

先来写一个函数重载的例子:

这两个函数的函数名相同,参数列表不同(一个是整型参数,一个是指针参数),构成函数重载
void fun9(int a)
{
	cout << __FUNCSIG__ << endl;
}
void fun9(int* p)
{
	cout << __FUNCSIG__ << endl;
}

此时我们在主函数中调用fun9函数,传参为空指针NULL

int main()
{
	fun9(NULL);	
	return 0;
}

查看运行结果:

在这里插入图片描述

输出的结果是void fun9(int a)函数

在这里插入图片描述

此时我不想调用指向整型的函数,而是要调用指向指针的函数,可传参又为空指针NULL,该如何实现呢?


函数重载中提到过函数的函数的局部变量声明,可以实现调用指向指针的函数

在这里插入图片描述


我们来探究一下空指针NULL调用了void fun9(int a)(传参为整型)函数的原因

在这里插入图片描述

NULL为宏定义,其本质是整数0,这也就是在函数调用中,把NULL当作0调用了函数,而不是当作一个空指针 的原因。

(define宏替换知识点:【c语言】详解宏定义#define

因此我们需要一个代表空指针的关键字,而不是对整型0的宏替换

在这里插入图片描述

C++11中引入了空指针nullptr,专门用来代表空指针

使用nullptr成功地达到了调用传参为指针函数的目的:

在这里插入图片描述

总结为:

  • 在函数重载中,宏替换NULL整型0造成歧义 需要nullptr代表空指针而非整型0

  • 关键字nullptr提高了程序的类型安全性和可读性,与NULL宏定义相比,具有更强的可靠性和扩展性。

三、NULL和nullptr的区别✧

NULL和nullptr都能当作空指针进行使用,他们之间本质的区别是什么呢?

  • NULL是一个,替换的是0 ,而nullptr是关键字,代表空指针

  • 含义不同,nullptr 代表是空指针,NULL 代表整型数字0

  • nullptr可以清晰地表达代码的意图,能够避免在类型检查时出现一些歧义问题

nullptr只能用于指针类型,不能与整数类型混淆~


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
本文章已经生成可运行项目
07-18
### ### nullptr 的用途用法 在 C++11 及更高版本中,`nullptr` 是一种类型安全、明确且易于理解的空指针表示方式,用于替代传统的 `NULL` 宏和整数常量 `0`。 `NULL` 相比,`nullptr` 提供了更强的类型安全性,避免了在函数重载时可能引发的歧义问题[^2]。 #### 基本用途 `nullptr` 主要用于表示一个不指向任何有效对象的指针值。 `NULL`(通常定义为 `0`)不同,`nullptr` 具有专属类型 `std::nullptr_t`,可以在不同上下文中正确匹配指针参数[^5]。例如: ```cpp void foo(int); void foo(char*); foo(nullptr); // 调用 foo(char*),因为 nullptr 是指针类型 foo(NULL); // 可能调用 foo(int),导致歧义 ``` #### 常见用法示例 - **初始化指针**:声明指针时,若尚未确定其指向的对象,可使用 `nullptr` 初始化以避免“野指针”问题[^4]。 ```cpp int* ptr = nullptr; ``` - **条件判断**:用于检查指针是否为空,确保访问前指针有效。 ```cpp if (ptr == nullptr) { // 执行分配或其他操作 } ``` - **智能指针结合使用**:`nullptr` 可用于初始化或赋值给 `std::unique_ptr` 和 `std::shared_ptr`,增强资源管理的安全性。 ```cpp std::unique_ptr<int> uptr = nullptr; std::shared_ptr<int> sptr = nullptr; ``` - **作为函数返回值**:用于表示函数未能成功返回有效指针的情况。 ```cpp int* findValue(int* arr, int size, int target) { for (int i = 0; i < size; ++i) { if (arr[i] == target) { return &arr[i]; } } return nullptr; } ``` --- ### ### 注意事项最佳实践 - **避免赋值给非指针类型**:`nullptr` 不能赋值给非指针类型的变量,例如 `int a = nullptr;` 会导致编译错误[^5]。 - **兼容性**:虽然 `nullptr` 是 C++11 引入的特性,但现代编译器普遍支持。在旧项目中应逐步替换 `NULL` 和 `0` 以提高代码可读性和类型安全性。 - **类型信息**:通过 `typeid` 可以观察到 `nullptr` 的类型为 `std::nullptr_t`,而 `NULL` 的类型通常为 `int`[^5]。 ```cpp #include <iostream> #include <typeinfo> int main() { std::cout << typeid(nullptr).name() << std::endl; // 输出 std::nullptr_t std::cout << typeid(NULL).name() << std::endl; // 输出 int } ``` --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值