概述
在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???
不能讲某个数字直接强制转化为指针吗
举个例子就可以了:
#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只是个数字是没有地址的。
而单纯的数字本身就是地址。
是的,在这里确实是这样,因为这个数字我们要把它强制类型转化成指针,所以这个数字就是地址
因为只有变量才有地址,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语言把它作为字符串的最后一个字符,以表示字符串到此结束."