指针空值nullptr(C++11)

news/2024/11/22 17:19:55/
在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现
不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下
方式对其进行初始化:
void TestPtr()
{
int* p1 = NULL;
int* p2 = 0;
// ……
}
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif
        可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦
void f(int)
{cout<<"f(int)"<<endl;
}
void f(int*)
{cout<<"f(int*)"<<endl;
}
int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}

        程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
        在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。
注意:
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的

2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

        为何不改null?

因为语言的发展要向前兼容,比如有人之前已经用一些可能有bug的语法写过代码,为了保证别人的代码还能够正常运行,bug可以补救,但是不要修改先前有的语法

 


http://www.ppmy.cn/news/22373.html

相关文章

【C++】C++入门 引用详解 带你由浅入深理解引用

引用一、引用的概念二、引用的特点三、特殊的引用——常引用1.变量的常引用2.常数的常引用四、引用的使用场景1. 作函数的参数2. 做函数的返回值五、传值、传引用效率比较1.传参时传值、传引用效率比较2.返回时传值、传引用效率比较六、浅析引用的底层原理七、总结一、引用的概…

Nginx内存池源码剖析

能看出来Nginx小块内存和大块内存分界线就是一个页面4k&#xff08;x86&#xff09; #define NGX_MAX_ALLOC_FROM_POOL (ngx_pagesize - 1)//能分配的最大内存#define NGX_DEFAULT_POOL_SIZE (16 * 1024)//默认池的大小 16k#define NGX_POOL_ALIGNMENT 16//字节对齐…

CUDA的代替选择

摘抄自CUDA并行程序设计 GPU编程指南&#xff1a;1.11 1.11.1 OpenCL 那么其他的 GPU 制造商&#xff0c;如 ATI(现在是AMD)能够成为主要的厂商吗? 从计算能力上看&#xff0c;AMD 的产品和英伟达的产品是旗鼓相当的。但是&#xff0c;在英伟达引入 CUDA 很长时间之后&#x…

使用addr2line分析crash问题

addr2line分析crash问题addr2line功能addr2line使用addr2line功能 addr2line可以通过解析地址来定位异常发生在哪个文件&#xff0c;哪个函数&#xff0c;哪一行&#xff1b;不过只对编译时带-g参数的进程或者库文件有效&#xff0c;因此想使用addr2line定义进程发生crash时的…

力扣 516. 最长回文子序列

动规最长回文子序列模板状态设计dp[i][j] : s[i~j]中最长的回文子序列的长度状态转移s[i] s[j] dp[i][j] dp[i1][j-1] 2两头相同 中间的最长的回文子序列2&#xff08;就是两头的&#xff09;s[i] ! s[j]dp[i][j] max(dp[i1][j], dp[i][j-1])两头不同 先去掉头试试 再去掉尾…

19个GIS相关地理信息数据

收录了19个GIS相关的数据集网站&#xff0c;包括大洲、国家、城市、街道的街景图片、地名信息、一些高精度地图、时区边界等各类数据。全部收录整理到 webhub​www.webhub123.com/?#/home/detail?projectHashid80195609&ownerUserid23585890 其中包含Github的&#xff…

一维数组篇——每日刷题经验分享

一维数组篇——每日刷题经验分享~&#x1f60e;前言&#x1f64c;记数问题&#x1f49e;逆序输出 &#x1f49e;N个数之和 &#x1f49e;最高分与最低分之差 &#x1f49e;争夺前五名 &#x1f49e;有序序列合并 &#x1f49e;有序序列判断 &#x1f49e;总结撒花&#x1f49e;…

cmake 创建静态库、创建动态库、进行连接

C 使用cmake编译 学习如何创建 静态库、动态库、 学习如何连接现有的 静态库、动态库、 生成静态库示例&#xff1a; 在account_dir目录下&#xff1a; Account_.h #ifndef Account_H #define Account_Hclass Account1 { private:/* data */ public:Account1(/* args */)…