[经验] c语言里NULL的理解

[复制链接]

助理工程师

发表于 7 天前   206 查看 1 回复 显示全部楼层 倒序浏览
分享
NULL一看名字就知道为空,什么为空呢,而且全是大写。是不是意味着是个宏定义呢?如果想到这里,我相信你离真理不远了。
有些人为什么犯错?因为只看到了NULL这四个字母而已,没有看到事物的本质,老师在课堂上也只是说空指针,空字符串。。这样只会陷入无止境的误区。如果我这样定义:
#define NULL 0
你是不是又该纠结了呢?
正确的做法是把它当作一个宏,不管如何变化,来展开看看就知道了。
在C语言的头文件stddef.h中,NULL的定义如下:
#define NULL
#define __cplusplus  //如果定义了__cplusplus表示是c++程序
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#interface NULL 0
所以,c语言里NULL的本质是(void *)0。
这里一开始就犯了个错,强制转换的意义是什么??感谢朱老师物联网大课堂的朱老师以及群里的朋友们的激烈讨论。以下内容截取自我们的讨论。

((void *)0)  本质上是将数字0强制转换为(void *)。0其实就是地址,(void *)只是说我们认为0这个地址中存储的类型是void *,也就是说0这个地址中存储的类型是void的,也就是当前不知道还未指定的.

0 地址是虚拟地址  还是物理地址?
不管是虚拟还是物理地址,就是当前环境的0地址。
要理解强制类型转换的本质
0还是0,永远是0,表示的永远是0这个内存地址;前面的类型,只是告诉我们我们认为0这个地址中装了什么
首先 这里的数字0  就是表示地址0???
不能讲某个数字直接强制转化为指针吗
举个例子就可以了:
#define GPJ0CON (unsigned int *)0x20008000

如果是需要将一个数字强制转换为指针,是不是可以这样写呢 int * &2, 是不是强制讲2转化为指针类型了呢

这样啊   (unsigned int *)0x2

char i=2; 间接讲2转换为int 指针。是不是这样写int * &i

char i = 2;之后 编译器会给i变量分配一个地址,&i  就是取i变量的地址。变量定义后就会分配地址。
我说的0,你这里写的2本身这个数字就是表示地址,而你的理解是2是值,这个值存在一个变量中,所以想通过&2去取2的地址,这个是错误的。因为只有变量才有地址,2只是个数字是没有地址的。
而单纯的数字本身就是地址。
是的,在这里确实是这样,因为这个数字我们要把它强制类型转化成指针,所以这个数字就是地址

C语言里有很多东西都是这种,规则只是讲了法律,但是实际应用中有很少常用技巧、或者衍生出来的用法,都没有提及,这也是我们的C高级课程中需要补充的。
因为只有变量才有地址,2只是个数字是没有地址的.因为这个数字我们要把它强制类型转化成指针,所以这个数字就是地址
C语言中就通过类型来表示这个单元中存的什么玩意,譬如(int)0就表示0地址中存的是int型的数;譬如你(int *)0就表示0地址中存的是个地址,这个地址指向的单元是int型数

NULL只是一个概念,叫作空值,其值本身没有任何含义,可以用0代替,也可以用1,...代替,只要这些值不会与系统实际的有效地址冲突即可。
因此,本人在此再次强调,不要自作聪明地认为NULL就是0,要判断的时候还是老老实实地与NULL做比较,别想当然地用什么!ptr之类的写法,因为在某个特定环境下,NULL可能不是0,而系

统函数返回的是NULL不是0,那时,你的函数就会出现莫名其妙的错误。所以,养成良好的习惯是非常重要的。

从这里学到了一点  如果看到了一个宏不会用   那么最好的办法 不是去看别人的解释  而是展开它,看它的最终展开形式。

总结如下:

c语言中NULL表示内存位置0,NULL((void *)0)指针并不指向任何对象。因此除非是用于赋值或比较运算,出于其他任何目的使用NULL指针都是非法的。


注意:在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它作为字符串的最后一个字符,以表示字符串到此结束."\0"

接下来:总结下NULL具体用在哪些场合。

第一:指针初始化(对应于上面的赋值)。


例如 int *x = NULL;

第二:函数返回是否成功判断(对应于做比较运算)。

当函数返回值为指针时,判断函数是否返回成功。举例如下:


FILE * pFile;pFile = fopen ("myfile.txt" , "r");if (pFile == NULL) printf("open error");

第三:判断字符串是否为空字符串(对应于做比较运算)。

if(str==NULL)或者if(str[0]=='\0') 就是空   

嵌入式学习交流群:561213221

发表于 7 天前  
交流群没通过啊
回复

点赞 举报

高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

DSP论坛

瑞萨单片机论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区