【C++入门】零域终端的虚空指针协议——【nullptr】还在为编译器给NULL匹配为int而头疼?nullptr给予你全新的字面量!

⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///


WARNING \]: DETECTING HIGH ENERGY **🌊 🌉 🌊 心手合一 · 水到渠成** ![分隔符](https://i-blog.csdnimg.cn/direct/60a3de2294e9439abad47378e657b337.gif) |------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| | **\>\>\> ACCESS TERMINAL \<\<\<** || | [**\[ 🦾 作者主页 \]**](https://blog.csdn.net/fengtinghuqu520?spm=1000.2115.3001.5343) | [**\[ 🔥 C语言核心 \]**](https://blog.csdn.net/fengtinghuqu520/category_12955956.html) | | [**\[ 💾 编程百度 \]**](https://blog.csdn.net/fengtinghuqu520/category_13083835.html) | [**\[ 📡 代码仓库 \]**](https://blog.csdn.net/fengtinghuqu520/article/details/147275999?spm=1001.2014.3001.5502) | --------------------------------------- Running Process: 100% \| Latency: 0ms *** ** * ** *** #### 索引与导读 * [💻NULL 的局限性](#💻NULL 的局限性) * [C++11引入的nullptr](#C++11引入的nullptr) * [代码示例](#代码示例) * [💻结尾--- 核心连接协议](#💻结尾— 核心连接协议) ## 💻NULL 的局限性 `NULL`实际是一个宏,在传统的C头文件`(stddef.h)`中,可以看到如下代码: ```c #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif ``` **#ifndef NULL** 如果当前环境中还没有定义过 `NULL` **#ifdef __cplusplus** 编译器在处理代码时,如果是`C++`环境,会自动定义`__cplusplus`这个**宏** **代码通过它来决定采用哪种定义方式:** * 在`C++`中 (`#define NULL 0`): 在`C++`里,指针的类型检查非常严格。在早期的`C++`标准中,`void*` 类型不能像在`C`语言中那样隐式转换为其他类型的指针。因此,将`NULL`直接定义为`整数 0` 是最兼容的做法,`C++` 编译器会自动将字面量`0` 视为空指针。 * 在 C 语言中 `(#else -> #define NULL ((void *)0))`: C 语言允许 `void*` 隐式转换为任意类型的指针。将 `NULL` 定义为 `((void *)0)`(即将地址 `0` 强制转换为无类型指针)更加直观且具备类型安全性,能够明确告诉编译器**这是一个"指针"而非"整数"** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a32a7b63f275450bb979e5ee41901c5a.png) *** ** * ** *** ## C++11引入的nullptr * `nullptr` 是一个**特殊的关键字** * `nullptr` 是一种**特殊类型的字面量** ,它可以**转换成任意其他类型的指针类型** * 使用 `nullptr` 定义**空指针** 可以避免类型转换的问题,因为 `nullptr` **只能被隐式地转换为指针类型,而不能被转换为整数类型** *** ** * ** *** ## 代码示例 ```cpp #include using namespace std; void f(int x) { cout << "f(int x)" << endl; } void f(int* ptr) { cout << "f(int* ptr)" << endl; } int main() { f(0); // 调用 f(int x) // 本想通过 f(NULL) 调用指针版本的 f(int*) 函数, // 但是由于 NULL 被定义成 0,调用了 f(int x),因此与程序的初衷相悖。 f(NULL); // 可能调用 f(int x)(如果 NULL 被定义为 0) f((int*)NULL); // 强制转换为 int*,调用 f(int* ptr) // 编译报错:error C2665: "f": 2 个重载中没有一个可以转换所有参数类型 // f((void*)NULL); // 无法隐式转换为 int*(C++ 不允许从 void* 到 int* 的隐式转换) f(nullptr); // 正确调用 f(int* ptr),nullptr 可隐式转换为任意指针类型 return 0; } ``` ❗❗❗❗❗❗ `f((void*)NULL)` 在`C++`中编译错误,因为`void*`不能隐式转换为 `int*`(`C` 语言允许,`C++` 不允许) *** ** * ** *** ## 💻结尾--- 核心连接协议 **警告:** 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠 *** ** * ** *** **【📡】 建立深度链接:** **关注**本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。 **【⚡】 能量过载分发:** 执行**点赞**操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。 **【💾】 离线缓存核心:** 将本页加入**收藏**。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。 **【💬】 协议加密解密:** 在**评论区**留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。 **【🛰️】 信号频率投票:** 通过**投票**发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。 *** ** * ** *** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57b03915c54b43a7a03fa92dbbfe57c3.gif) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0905dc972de8414bb602715de3f866ee.gif)

相关推荐
小王不爱笑1322 小时前
IO 模型
开发语言·python
知我Deja_Vu2 小时前
【避坑指南】ConcurrentHashMap 并发计数优化实战
java·开发语言·python
AI+程序员在路上2 小时前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
2401_831824962 小时前
基于C++的区块链实现
开发语言·c++·算法
汉克老师3 小时前
GESP5级C++考试语法知识(六、链表(一)单链表)
c++·链表·单链表·快慢指针·进阶·gesp5级·gesp五级
m0_518019483 小时前
C++与机器学习框架
开发语言·c++·算法
ZTLJQ3 小时前
深入理解逻辑回归:从数学原理到实战应用
开发语言·python·机器学习
qq_417695053 小时前
C++中的代理模式高级应用
开发语言·c++·算法
学嵌入式的小杨同学3 小时前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
xiaoye-duck4 小时前
《算法题讲解指南:动态规划算法--路径问题》--5.不同路径,6.不同路径II
c++·算法·动态规划