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


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

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


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

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

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

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

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



相关推荐
spider_xcxc11 分钟前
Jenkins 遇见 Argo CD:构建可靠 GitOps 流水线的实战指南
java·开发语言·servlet
June`34 分钟前
常量内存和只读缓存
c++·人工智能·算法·cuda
IT小盘37 分钟前
16-Prompt版本管理-从手工修改到可追踪配置系统
开发语言·人工智能·python·prompt
Cx330❀1 小时前
【Linux网络】深入 HTTP 协议(五):从 Cookie/Session 原理到 C++ 源码实战
linux·运维·服务器·开发语言·网络·c++·http
鸿芯微控科技1 小时前
MFC气体转换系数怎么用?标定气体、换算方向与Python批量计算
c++·python·mfc
北冥you鱼1 小时前
Go语言四则运算实战:从基础类型到big包的深度解析
开发语言·后端·golang
江畔柳前堤9 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
Wang's Blog10 小时前
Go-Zero 项目开发47:自研微服务框架的必要性与核心结构设计
开发语言·微服务·golang
白鸽(二般)10 小时前
MinIO Java Client API
java·开发语言
hPw0eKIqD10 小时前
C++ 模板参数推导问题小记(非推导上下文)
开发语言·c++