c语言null和nullptr,nullptr与NULL

c语言null和nullptr,nullptr与NULL在 C 语言中 我们使用 NULL 表示空指针 它实际上是一个宏 具体被定义为 C 语言程序 defineNULL void 0 defineNULL0 两者皆可 注 因为在 C 语言中 是允许 void 指针隐式转换为其它类型指针的 所以 defineNULL void 0 这样的定义不会有问题 C 语言出现后 为了保持对 C 语言的兼容 保

在 C语言 中,我们使用 NULL

表示空指针,它实际上是一个宏,具体被定义为,

/* C 语言程序 */

#define NULL ((void*)0)

#define NULL 0 /* 两者皆可 */

注:因为在C语言中,是允许 void

指针隐式转换为其它类型指针的,所以 #define NULL ((void*)0)

这样的定义不会有问题。

C++语言出现后,为了保持对C语言的兼容,保留了 NULL

,但对 NULL

的定义变得更为严格,

/* C++ 语言程序 */

#ifdef __cplusplus

#define NULL 0

#else

#define NULL ((void*)0)

#endif

NULL

被定义为0,而不是 ((void*)0)

,因为在C++语言中, void

指针是不可以隐式转换为其它类型指针的,必须显示转换,

/* C++ 语言程序 */

#define NULL ((void*)0) /* 如果在 C++ 语言中这么定义的话 */

int* a = NULL; /* 隐式转换,错误 */

int* a = (int*)NULL; /* 显示转换,正确,但很麻烦,所以 NULL 都会被定义为 0 */

在C++ 98之前(包括C++ 98),在对 NULL

的使用上,都一直存在一个问题,假设有下面的代码,

/* C++ 语言程序 */

void func(int i);

void func(char* p);

func(NULL); /* 该调用哪个?*/

NULL

其实就是等于0,对于上面的两个函数,它都是符合的,如此,就会出现语义二义性的错误。

为了解决上述重载函数所带来的问题,C++ 11的 nullptr

应运而生。 nullptr

实质上是一个常量,实现代码大致如下,

/* C++ 语言程序 */

const /* 常量 */

class

{

public:

template

operator T*() const /* 向任意类型的非成员指针转换 */

{

return 0;

}

template

operator T C::*() const /* 向任意类型的成员指针转换 */

{

return 0;

}

private:

void operator&() const /* 不可取地址 */

{

}

} nullptr = {};

nullptr

只是一个常量,这就意味着我们可以在程序中随意定义一个与其名称相同的标识符,但因为 nullptr

在实际编程中的应用实在太广泛,因此C++编译器一般都会把 nullptr

定为关键字,避免 程序员 的滥用。

当然,C++ 11发布后,并没有因为 nullptr

的出现,而摒弃 NULL

,主要是为了兼容旧版程序。

最后,总结一下,

在C语言编程中,请使用 NULL

此时的 NULL

,要么是 ((void*)0)

,要么是0,对于C语言而言,都无所谓。

在C++语言编程中,请使用 nullptr

既为了避免以后出现bug,也为了养成一个良好的编程习惯。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228663.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午6:29
下一篇 2026年3月16日 下午6:29


相关推荐

  • 非同构无向图(同形同构)

    题目链接:http://codeforces.com/problemset/problem/103/B大意:判断图的形状是否为一个章鱼型(?)由几棵树构成,树的根节点围成一个环。思路:只需判断一棵树内加一个环即可。判断方法:边数==顶点数&&连通图#include#definemem(s,t)memset(s,t,sizeof(s))

    2022年4月13日
    221
  • 五、(基础)别让大模型 “断网”!教你用 LangChain 开发联网 AI Agent,实操教程来了

    五、(基础)别让大模型 “断网”!教你用 LangChain 开发联网 AI Agent,实操教程来了

    2026年3月12日
    3
  • earlysuspend[通俗易懂]

    earlysuspend[通俗易懂]earlysuspend================ 头文件:linux/earlysuspend.h使用earlysuspend—————— 另外andorid还支持内核中的earlysuspend操作,因为kenerl此前的电源管理就是把几乎所有的设备 都拖入睡眠模式,但多数情况下有些设备还不需要睡眠。ealysuspen

    2026年1月20日
    5
  • sdp详细介绍

    sdp详细介绍1 SDP 协议概述 SDP Session nbsp Description nbsp Protocol 是一个用来描述多媒体会话的应用层控制协议 为会话通知 会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述 它是一个基于文本的协议 这样就能保证协议的可扩展性比较强 这样就使其具有广泛的应用范围 SDP 完全是一种会话描述格式 nbsp 它不属于传输协议 它只使用不同的适当的传输协议 包括会话通知协议 SA

    2026年3月18日
    2
  • c语言break可以跳出for循环吗,怎么跳出for循环

    c语言break可以跳出for循环吗,怎么跳出for循环如何跳出 for 循环 continu 只能跳出当前 for 循环继续 for 循环 但是我想跳出 for 之外的 for 循环如何做呢 下面的代码我用了 goto 想跳到 loop 处的 for 循环处继续循环 但是不对 不知道怎么做了谢谢大家解答 for inti 0 i loop for intj 0 jgcNc 0 cellNc i NombreFreque j intfreq ran

    2026年3月20日
    3
  • SpringBoot引入jieba分词

    SpringBoot引入jieba分词1 添加 maven 依赖 https mvnrepositor com artifact com huaban jieba analysis dependency groupId com huaban groupId artifactId jieba analysis artifactId dependency

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号