【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++ 不允许)


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

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


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

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

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

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

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



相关推荐
何何____9 分钟前
js的数据存储机制
开发语言·前端·javascript·ecmascript
夏天的峰没有风13 分钟前
Typora+gitcode+picgo搭建免费图床
开发语言·ios·swift
旺仔老馒头.16 分钟前
【C++】类和对象(三)
开发语言·c++·程序人生·类和对象
Zklys17 分钟前
Cmake的学习笔记step1
c++·笔记·学习
右耳朵猫AI17 分钟前
Java & JVM技术周刊 2026年第19周
java·开发语言·jvm
zincsweet19 分钟前
C++ 实现进程池:主从架构、管道通信与任务调度
linux·c++
han_hanker19 分钟前
Java 对象序列化
java·开发语言
zhojiew20 分钟前
通过Toxiproxy从原理到实践理解混沌工程
开发语言·php
雪之下雪乃的代码日记24 分钟前
认识Java中集合框架
java·开发语言·笔记
草莓熊Lotso25 分钟前
【CMake】静态库的编译、链接与引用全解析
linux·c语言·数据库·c++·软件工程·cmake