什么是“NULL”
Last modified:2013-04-28 22:36:18
*******************************************
有过编程经历的同学都接触过“NULL”,中文我们常常将它理解为:空的,无价值的。
那么“NULL”是怎么样定义的呢?
如果从底层实现来说,如果我们存储一个“NULL”,那么我们内存中存储的二进制码用十六进制可以表示为:0x0000 0000(这是相对于地址总线为32位说的);这是“NULL”的本质!数据本身是没有含义的,关键看我们怎么去解释。
那么,怎样来理解“0x0000 0000”呢?它有什么含义呢?
1,代表数值为0;
2,字符串的结束标记符“\0”(ASCII中编码形式为“0x00”);
3,空类型指针(也就是[void *]类型),并且值为0;也就是C语言中定义的NULL的含义:
在C语言的头文件stddef.h中,NULL的定义如下:
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif #interface NULL 0
这样就相当明了了,“NULL”是一个指针,他指向的类型为void,既然是指针,那么“NULL”也就代表编号为0的地址呗!我大胆的做了一下实验:
#include <stido.h> int main(voie){ int * p = 0x00000000; //void * 类型占4个字节。如果直接写成void * p = 0; //编译器直接报错不让编译。所以我们可以用int *来模拟一下 printf(“p = %#X\n”,*p); //我想看看地址值为0的地方到底存放了些什么 return 0; }
编译成功,但是运行时提示异常代码:c0000005
通过查询资料了解到:
地址为0x0000 0000的地方存放的是:中断向量表中的除法溢出中断。
计算机中从0x0000 0000开始一部分地址空间里,存放了系统中非常重要的数据。如以上所说的中断向量。程序员是不能对以0x0000 0000为编号的存储单元进行读写操作的。
当我们试图去访问这个区域时,VC++这个软件给我们检测到了这个错误,并给予了提示。
(不知理解是否正确,如果有误请高手指出)
注:
中断向量表:(中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址)称为中断向量。在Pc/AT中由硬件产生的中断标识码被称为中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、CPU自动形成等),即在中断响应期间8259A产生的是当前请求中断的最高优先级的中断源的中断类型号。中断类型号和中断向量之间有下面的关系: 中断类型号×4=存放中断向量的首地址 有了存放中断向量的首地址,从该地址开始的4个存储单元中取出的就是中断服务程序的入口。
中断向量:是指中断服务程序入口地址的偏移量与段基值,一个中断向量占据4字节空间。中断向量表是8088系统内存中最低端1K字节空间,它的作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储256个中断向量。在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址。
8086系统是把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域内,这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表。
80x86中断向量:
I/O ADDR INT TYPE FUNCTION
00 ~ 03 0 除法溢出中断
04 ~ 07 1 单步(用于DEBUG)
08 ~ 0B 2 非屏蔽中断(NMI)
0C ~ 0F 3 断点中断(用于DEBUG)
... ... ... ... ... ...