#include
(3)
void *类型的指针指向的内存是尚未确定类型的,因此我们后续可以使用强制类型转换强行将其转换为各种类型;
这就是void类型的最终归宿,就是被强制类型转换成一个具体类型。
(4) void 类型使用时一般都是用void *,而不是仅仅使用void。
NULL
新媒体排版
1
NULL在C/C++中的标准定义:
(1) NULL不是C语言关键字,本质上是一个宏定义。
(2) NULL的标准定义:
#ifdef _cplusplus // 条件编译#define NULL 0#else#define NULL (void *)0 // 这里对应C语言的情况#endif
解释:C++的编译环境中,编译器预先定义了一个宏_cplusplus,程序中可以用条件编译来判断当前的编译环境是C++的还是C的。NULL的本质解析:NULL的本质是0,但是这个0不是当一个数字解析,而是当一个内存地址来解析的,这个0其实是0x00000000,代表内存的0地址。(void *)0这个整体表达式表示一个指针,这个指针变量本身占4字节,地址在哪里取决于指针变量本身,但是这个指针变量的值是0,也就是说这个指针变量指向0地址(实际是0地址开始的一段内存)。
2 从指 针角度理解NULL的本质:(1) int *p; p是一个函数内的局部变量,则p的值是随机的,也就是说p是一个野指针。
(2) int *p = NULL; p是一个局部变量,分配在栈上的地址是由编译器决定的,我们不必关心,但是p的值是(void *)0,实际就是0,意思是指针p指向内存的0地址处。这时候p就不是野指针了。
(3) 为什么要让一个野指针指向内存地址0处?主要是因为在大部分的CPU中,内存的0地址处都不是可以随便访问的(一般都是操作系统严密管控区域,所以应用程序不能随便访问)。所以野指针指向了这个区域可以保证野指针不会造成误伤。如果程序无意识的解引用指向0地址处的野指针则会触发段错误。这样就可以提示你帮助你找到程序中的错误。
3 为什么需要NULL:(1) 第一个作用就是让野指针指向0地址处安全。
(2) 第二个作用就是一个特殊标记。按照标准的指针使用步骤是:
int *p =
注意:一般比较一个指针和NULL是否相等不写成if (p == NULL),而写成if (NULL == p)。原因是第一种写法中如果不小心把==写成了=,则编译器不会报错,但是程序的意思完全不一样了;而第二种写法如果不小心把==写成了=则编译器会发现并报错。
4 注意不要混用NULL与'\0':(1) '\0' 和 '0' 和 0 和 NULL几个区分开。
(2) '\0'是一个转义字符,他对应的ASCII编码值是0,本质就是0。
(3) '0'是一个字符,他对应的ASCII编码值是48,本质是48。
(4) 0是一个数字,他就是0,本质就是0。
(5) NULL是一个表达式,是强制类型转换为void *类型的0,本质是0.
总结:'\0'用法是C语言字符串的结尾标志,一般用来比较字符串中的字符以判断字符串有没有到头;'0'是字符0,对应0这个字符的ASCII编码,一般用来获取0的ASCII码值;0是数字,一般用来比较一个int类型的数字是否等于0;NULL是一个表达式,一般用来比较指针是否是一个野指针。
关注公众号,每周分享至少3篇开源技术干货,文章中如有没看懂的地方可以私聊我,我看到了会立马回复你,个人微信号:a18879499804,在看的话,帮忙点个赞,非常感谢!
文章后记
这里是公众号:“最后一个bug”,感谢各位的关注,这里将是帮你找到最后一个bug的技术研究基地。下期精彩见!
推荐好文 点击蓝色字体即可跳转☞【硬壳】C程序里面嵌点"机器码"玩一玩"(小知识揭露大道理)
☞顿悟,神秘的register关键字(C语言篇)
☞【典藏】深度剖析单片机程序的运行(C程序版)
☞【连载】通过"库文件"学单片机驱动编程(5)-完结篇
☞C语言为什么一般不在.h中定义函数或者变量?(精华)
☞手把手教你写Modbus-RTU协议(理论篇)
☞单片机开发之节省内存大法(C语言版本)
☞嵌入式编程之动态接口技术(经验干货)
☞【典藏】自制小型GUI界面框架(设计思想篇)