什么是“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)
... ... ... ... ... ...
相关推荐
本文主要讨论了如何正确判断Java中的String对象是否为null、空值("")以及它们的地址是否相等。在处理字符串时,了解这些概念对于避免程序出错至关重要。 首先,我们需要区分`null`和空字符串`""`。`null`表示变量...
首先,让我们来了解什么是空指针常量(null pointer constant)。根据 C 语言标准,一个整型常量表达式的值为 0,或者将其转换为 void * 类型的表达式,都是空指针常量。例如,0、0L、'/0'、3 - 3、0 * 17、(void*)0...
首先,需要了解什么是空指针常量(null pointer constant)。根据C标准,空指针常量是一个整数常量表达式,值为0,或者是一个 cast 到 type void * 的表达式。例如,0、0L、'\0'、3 - 3、0 * 17 和 (void*)0 都是空...
如果既不指定NULL也不指定NOT NULL,列被认为指定了NULL 在 MySQL 中, 为一个 NOT NULL 字段设置 NULL 值 , 它并不会出错, MySQL 会自动将 NULL值转化为该字段的默认值, 那怕是你在表定义时没有...
C语言头文件 _NULLC语言头文件 _NULLC语言头文件 _NULLC语言头文件 _NULLC语言头文件 _NULLC语言头文件 _NULLC语言头文件 _NULLC语言头文件 _NULLC语言头文件 _NULLC语言头文件 _NULLC语言头文件 _NULLC语言头文件 _...
你是否也为在Oracle里如何实现NULL的比较而犯愁呢?
首先,我们要理解“null.sys”是什么。它是一个内核模式设备驱动程序,通常用于模拟空设备,即无输入或输出的设备。在某些情况下,如果这个驱动出现问题,可能会干扰到系统的正常运行,特别是对于依赖特定驱动程序的...
null and not null
我们如果将NULL值与另一个NULL值或任何其他值进行比较,则结果为NULL,因为一个不知道是什么的值(NULL值)与另一个不知道是什么的值(NULL值)比较,其值当然也是一个不知道是什么的值(NULL值)。 然而我们通常,使用...
首先,我们需要理解为什么Git会尝试操作`/dev/null`。在Git中,`/dev/null`常用于清理或重置标准输出和标准错误,特别是在一些命令执行后,可能需要清空输出以避免干扰后续的处理。例如,在某些脚本或者自动化任务中...
在Cisco网络设备中,"IP NULL"是一种特殊路由操作,它是IP路由表中的一个条目,用于处理特定类型的流量。这个知识点在理解网络路由机制时非常关键,特别是对于那些需要精细控制网络流量走向的网络管理员而言。下面...
### C语言中的"NULL"详解 #### 一、引言 在C语言中,“NULL”是一个非常重要的概念,尤其在处理指针时更是如此。本文将深入探讨“NULL”在C语言中的含义及其用途,帮助读者更好地理解并运用这一概念。 #### 二、...
首先,我们需要理解null.sys是什么。在Windows操作系统中,null.sys通常是一个设备驱动程序,用于处理空设备或NULL设备。这种设备在编程中常用于丢弃输入数据或提供无源输出。在Git上下文中,null.sys异常可能源于...
首先,我们需要理解为什么null值会导致移动应用崩溃。在大多数编程语言中,尝试访问null对象的方法或属性会抛出异常,这在Java、Swift、Kotlin等移动开发常用的语言中尤为常见。例如,在Java中,如果你试图调用一个...
在本期中,我们将讨论为什么不建议给 MySQL 设置 Null 值,并分析 Null 值对数据统计的影响。 1. Null 值对统计的影响 在 MySQL 中,Null 值的存在可能会导致数据统计不准确。例如,在使用 count 函数时,如果存在...
在Windows 10专业版操作系统中,安装Git时遇到找不到`/dev/null`的问题,这通常是由于Windows与Unix/Linux系统之间文件系统结构的差异引起的。`/dev/null`在Linux和Unix-like系统中是一个特殊设备文件,它用于丢弃...
### 深入Java关键字null #### 一、null代表不确定的对象 在Java语言中,`null`是一个非常重要的关键字,用于表示一个未确定的对象引用。这意味着你可以将`null`赋给任何引用类型变量,而不能将其赋给基本类型变量...
标题 "fixed_null.zip" 暗示我们正在处理一个修复或替换系统文件的操作,特别是针对 `null.sys` 文件。这个文件是Windows操作系统中的一个关键驱动程序,它在系统中扮演着重要的角色,例如处理硬件设备的空引用或者...
在命令提示符(cmd)中输入 `sc query null` 可以查询名为“null”的服务是否存在,而 `sc start null` 则尝试启动这个服务。 当Git Bash闪退时,可能是由于以下原因: 1. **系统服务冲突**:Git Bash的运行依赖于...
null or not null