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

⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///


WARNING : DETECTING HIGH ENERGY

🌊 🌉 🌊 心手合一 · 水到渠成

|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
| >>> ACCESS TERMINAL <<< ||
| 🦾 作者主页 | 🔥 C语言核心 |
| 💾 编程百度 | 📡 代码仓库 |


Running Process: 100% | Latency: 0ms


索引与导读

💻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 强制转换为无类型指针)更加直观且具备类型安全性,能够明确告诉编译器这是一个"指针"而非"整数"


C++11引入的nullptr

  • nullptr 是一个特殊的关键字
  • nullptr 是一种特殊类型的字面量 ,它可以转换成任意其他类型的指针类型
  • 使用 nullptr 定义空指针 可以避免类型转换的问题,因为 nullptr 只能被隐式地转换为指针类型,而不能被转换为整数类型

代码示例

cpp 复制代码
#include <iostream>
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++ 不允许)


💻结尾--- 核心连接协议

警告: 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠


【📡】 建立深度链接: 关注本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。

【⚡】 能量过载分发: 执行点赞操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。

【💾】 离线缓存核心: 将本页加入收藏。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。

【💬】 协议加密解密:评论区留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。

【🛰️】 信号频率投票: 通过投票发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。



相关推荐
j7~2 小时前
【C++】《C++STL 笔记:搞懂序列 / 关联容器,聊聊 set 和 map》
c++·set·map·multimap·multiset·键值对pair·序列是容器和关联式容器
luteres3 小时前
Mybatis+SSM整合笔记
java·开发语言·mybatis
郝学胜-神的一滴3 小时前
《C++11 工程级应用01:告别冗长类型,开启简洁高效编码新时代》深度解读
开发语言·c++·算法·软件开发·系统设计
其实防守也摸鱼3 小时前
推荐一个自动化教育SRC漏洞挖掘系统--AutoHunter
运维·开发语言·人工智能·学习·安全·web安全·自动化
覆东流9 小时前
7.Java数组
java·开发语言·后端
码行山野赴时序归途10 小时前
三道经典数组题:从暴力到最优的算法思维
c语言·开发语言·数据结构·算法·leetcode
lzhdim10 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
JavaPub-rodert10 小时前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
ly768912 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
落魄大学生之流水线上谋生计12 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言