首页 > 编程语言 >C语言和C++中的空指针区别

C语言和C++中的空指针区别

时间:2024-01-25 14:55:52浏览次数:24  
标签:void nullptr C++ C语言 NULL 指针

C语言中,空指针是NULL,是一个宏

在C++中NULL似乎也可以用,但是C++中的NULL其实是有问题的。C++大佬在设计的时候可能没有考虑全面

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量

但是编译器默认情况下 将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

看一下在C++中NULL的定义

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

可以看到,NULL在C++中其实就是 0

在C语言中才是(void*)0,即空指针

所以C++如果用NULL做空指针,就会出现这种情况

//f函数构成函数重载
void f(int)
{
 	cout<<"f(int)"<<endl;
}
void f(int*)
{
 	cout<<"f(int*)"<<endl;
}

int main()
{
    int* p = NULL;
    f(NULL);//调用 f(int)
    f(0);// 调用f(int)
    f(p);// 调用f(int*)
    
    /* 显然,f(NULL)我们本想调用 f(int*)
    但是却调用成了 f(int) */
    return 0;
}

所以为了补C++的坑,C++11中引入了nullptr作为空指针

注意

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的
  2. C++11中,sizeof(nullptr)sizeof((void*)0)所占的字节数相同

标签:void,nullptr,C++,C语言,NULL,指针
From: https://www.cnblogs.com/iiianKor/p/17987147

相关文章

  • 深入解析C++中sizeof和strlen的奥秘:区别、应用与技巧全揭秘!
     sizeof 和 strlen 是C++中用于处理字符串的两个不同的操作符,它们的作用和使用场景有很大的区别。sizeof操作符:区别:sizeof 是一个运算符,不是一个函数,用于获取一个类型或变量的字节大小。对于数组,sizeof 返回整个数组的字节大小。对于指针,sizeof 返回指针本身的......
  • C转C++速成浅入浅出系列——STL之vector
    本系列为应付考研复试用,知识浅入浅出,很多地方不深究细节原理;如有谬误,欢迎大家指出。vector【vector:矢量,向量】理解为向量、动态数组等。我想在我这种入门阶段,最常用的还是其动态数组的功能。需提供头文件#include<vector>创建可指定数组大小,和所有值的初始值;数组大小初始值......
  • C转C++速成浅入浅出系列——STL之set
    本系列为应付考研复试用,知识浅入浅出,很多地方不深究细节原理;如有谬误,欢迎大家指出。set【setof:集合】理解为集合。特点是①元素各不相同②元素会自动从小到大排序③初始时无法指定其大小需提供头文件#include<set> 创建注意初始时不能指定其大小。(不能说集合里有5个......
  • c++ openssl加密 解密
    #include<iostream>#include<boost/asio.hpp>#include<boost/beast.hpp>#include<boost/beast/websocket.hpp>#include<boost/asio/spawn.hpp>#include<json.hpp>#include<boost/filesystem.hpp>#include<fstrea......
  • java中双指针算法(快指针与慢指针)
    双指针法:设置两个指针,分别是快指针和慢指针,分别是i和j。  设置一个变量temp用来储存第一个数据nums[0] 过程:1.nums[0]  temp  他们两个相等  那么temp不需要改变,i=i+1,j变,i=1,j=1   2.nums[i=1],temp  他们两个相等,temp不变,i=i+1,j不......
  • 用C++11打造智能观察者模式:详解实现步骤完整示例代码
     观察者模式是一种行为设计模式,其中一个对象(主题)维护其依赖对象(观察者)的列表,当主题的状态发生变化时,它通知所有观察者。以下是一个使用C++11实现观察者模式的简单例子:定义观察者接口(Observer): 创建一个观察者接口,该接口包含观察者需要实现的更新方法。这个接口可以包含其他......
  • 【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)
    (文章目录)......
  • C语言基础-复合赋值和递增递减-day4
    一、复合赋值total+=(sum+100)/2;total=total+(sum+100)/2;total*=sum+12;total=total*(sum+12);自右向左结合#include<stdio.h>intmain(){inttotal=0;intsum=0;total+=(sum+100)/2;printf("total+=(sum+100)/2=......
  • C语言基础-表达式-day3
    一、表达式一个表达式是一系列运算符和算子的组合,用来计算一个值运算符是指进行运算的动作,比如加法运算符+,减法运算符-算子是指参与运算的值,这个值可能常数,也可能是变量,还可能是一个方法的返回值1、计算时间差#include<stdio.h>intmain(){inthour1,minute1;......
  • 1. C++ 开发环境
    C++开发环境VisualC++/GCC(G++)/Clang(Clang++)集成开发环境:VisualStudio/CodeLite/Code::blocks/CLion/Eclipse...工具:/usr/bin/timevalgrindcppreferenceCompilerexplorerC++Insights当前各版本编译器对C++20特性的支持情况:查看网站:https://......