大家好,欢迎来到IT知识分享网。
一:NULL在C/C++中的标准定义
(1)NULL不是C语言的关键字,本质上是一个宏
(2)NULL的标准定义:
#ifdef _cplusplus //条件编译
#define NULL 0
#else
#define NULL (void *)0
#endif
C++的编译环境中,编译器预先定义了一个宏: _cplusplus ,程序中可以用条件编译来判断当前的编译环境是C还是C++的
NULL的本质解析:NULL的本质是0,但是这个0不是当一个数字解析,而是当一个内存地址来解析的,这个0其实是0x00000000,代表内存0地址。 (void *)0这个整体表达式表示一个指针,这个指针变量本身占四个字,地址在哪里取决于于编译器把这个指针变量分配在哪里,但是这个指针变量的值为0,也就是说这个指针变量指向0地址(实际是0地址开始的一段内存)
二:从指针角度理解NULL的本质
(1)int *p; //如果p是函数内部的局部变量,则p的值随机的,也就是说p是一个野指针
(2)int *p; //p是一个局部变量,分配在栈上的地址是由编译器决定的,程序员不必关心,但是p的值是 (void *)0,实际就是0,意思就是指针p指向内存的0地址处。这时候p就不是野指针了
(3)为什么要让一个野指针指向内存地址0处?主要是因为在大部分cpu中,内存的0地址都是不可以随便访问的(一般都是操作系统严密监控地区,所以应用程序不能随便访问)所以野指针指向了这个区域可以保证野指针不会造成误伤。如果程序无意识的解引用指针0地址处的野指针则会触发段错误。这样就可以提示你帮助你找到程序中的错误
三:为什么需要NULL
(1)第一个作用就是让野指针指向0地址处安全
#inlude <stdio.h> int main(void) { int *p = NULL; //定义时立即初始化为NULL p = xx; if(NULL ! =p) { *p //在确认指针p不等于NULL时才去解引用p } p = NULL; //用完之后p立即再次等于NULL }
注意: 一般比较一个指针和NULL是否相等不写成if(p==NULL) ,而写成if(NULL == p)
原因是:第一种如果不小心把 == 写成了 = 编译器不会报错 ,而第二种 == 写成 = 编译器会发现并报错
四:不要混用NULL和‘0’
(1)‘\0’ 和 ‘0’ 和 0 和NULL几个区分开
(2)’\0’是一个转义字符,它对应的ASCII编码值是0,本质就是0
(3)‘0’是一个字符,对应的ASCII的编码值是48,本质是48
(4)0是a一个数字,本质就是0
(5)NULL是一个表达式,是强制类型转换为void * 类型的0,本质是0
总结: ‘\0’用法是C语言字符串的结尾标志,一般用来比较字符串的字符以判断字符串有没有到头;
‘0’是字符0,对应0这个字符的ASCII编码,一般用来获取0的ASCII码值;
0是数字用来比较一个int类型的数字是否等于0;
NULL是一个表达式一般用来比较指针是否是一个野指针;
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/149388.html