栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++11新特性之nullptr【nullptr是nullptr

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++11新特性之nullptr【nullptr是nullptr

在C++11之前的C++98/03我们使用空都是NULL关键字,后来C++11之后新增了nullptr关键字来表示空。那么有了NULL还要弄个nullptr出来干什么呢?是不是吃太饱了?

为了来剖析这两者的区别,我们先来看一个什么是野指针;

int serven_1 = 9;
int* serven_p;
int* serven_q = &serven_1;

上面的代码中,serven_p就是野指针,因为定义他的时候没有给他指向的地方,导致他指向了哪些不可用的内存区域:

所以你定义了指针,就算没有使用他,你也要给个空给他,不然等到内存溢出崩溃的时候,不仅他会哭,你也会被急哭。

在C++98/03标准中,我们在定义一个指针并且给其赋值为空的时候有两种写法,不仅可以使用NULL,也可以使用0,不信你去试试看:

int* serven_p = NULL;
int* serven_q = 0;

这两种写法完全木有问题,都是OK的。但还是推荐使用第一种写法。毕竟代码编写要规范嘛(这里备注一下:代码编写不规范真的会被打,从现在开始就要养成良好的编程习惯)。

上面的指针serven_q直接附了0是什么意思呢?有没有联想到大学老师给你上课的时候,反复敲着黑板跟你们说:“咳咳咳~,大家注意了,指针指向的是变量的地址,他本身也是个内存空间,只是这个内存空间存放的是他指向的变量在内存中的地址”。所以呢,这里的serven_q相当于指向了0地址,也就是0x0000 0000这个内存空间。这个0地址呢,在很多操作系统(像Windows、Linux的等等)是不允许用户操作使用的,例如:

#include 

using namespace std;


int main(int argc, char *argv[]) {
    int *serven_p = 0;
    // *serven_p = 4;          // 这是不允许的
    printf("%pn", serven_p);
    // printf("%dn", *serven_p);
    return 0;
}

运行结果:

0000000000000000

Process finished with exit code 0

结果分析:serven_p指向的是0地址。

把代码中的两句注释语句恢复:

#include 

using namespace std;


int main(int argc, char *argv[]) {
    int *serven_p = 0;
     *serven_p = 4;          // 这是不允许的
    printf("%pn", serven_p);
     printf("%dn", *serven_p);
    return 0;
}

运行结果:

Process finished with exit code -1073741819 (0xC0000005)

结果分析:看到了吧,打印出来后啥都没有。这下可以相信了吧。

但是在日常编程中,我们还是习惯使用NULL来给指针做初始化,但是NULL并不是C++的关键字,它是一个宏定义。

在Visual Studio平台中,当你在编写代码中转至NULL的定义的时候,会跳到afx.h显示下面的代码:

...
#define NULL    0
...

其实NULL宏定义就是一个0,惊不惊讶!反正我是挺惊讶的。好吧,既然它是0,那么就当它是空吧,这个披着外皮的狼,居然骗了我们这么多年。那就用它吧。




参考资料:
C++11新特性之nullptr
C++11新特性——nullptr

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015800.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号