【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)

相关推荐
edisao1 小时前
一。星舰到底改变了什么?
大数据·开发语言·人工智能·科技·php
阿豪只会阿巴2 小时前
【多喝热水系列】从零开始的ROS2之旅——Day10 话题的订阅与发布1:Python
开发语言·c++·python·ubuntu·ros2
羊小猪~~2 小时前
【QT】--文件操作
前端·数据库·c++·后端·qt·qt6.3
Frank Castle2 小时前
【C语言】详解C语言字节打包:运算符优先级、按位或与字节序那些坑
c语言·开发语言
kk哥88992 小时前
分享一些学习JavaSE的经验和技巧
java·开发语言
2501_940315262 小时前
【无标题】1.17给定一个数将其转换为任意一个进制数(用栈的方法)
开发语言·c++·算法
lagrahhn2 小时前
Java的RoundingMode舍入模式
java·开发语言·金融
fpcc3 小时前
C++23中的模块应用说明之五综合应用和重点分
c++·c++23
云上凯歌3 小时前
01 GB28181协议基础理解
java·开发语言