空指针是什么
c中空意味着它与任何对象与函数的指针值都不相等也就是说我们并不能通过&来得到空地址(其实这在数学逻辑上是矛盾的,但是我们暂且这么认为)
所以空指针在概念上不同于未初始化的指针,因为未初始化的指针可以指向任何地方。
每种指针类型都有其空指针,不同空指针的内部表示也不尽相同,尽管程序员并不知道内部值。编译器知道就行了。
怎样获得一个空指针
根据定义,在指针上下文的常数0会在编译时转换为空指针。也就是说,在初始化的赋值或比较的时候,如果一边是指针类型的值或者表达式,编译器可以确定右侧的零为空指针值。也就有了
char *p = 0;
以上代码合法
但是,传入函数的参数不一定会被当作指针环境,因而编译器可能不能识别未加修饰的0,在函数中调用上下文中需要明确的类型转换。
在unix中 需要 (char *)0这样写才合法(许多unix手册在调用excel()上都错了)。
另外提一句if(p)这种形式并没有什么不必要的争论,编译器都会把它当作if(p!=0).
NULL是什么
null不过是头文件用宏定义的一个空指针常量。
还有null只能用于指针常数。
我还是要插一嘴,有人问null定义成#define null ((char *)0)不就可以想函数传入不加转换的null了么。(md你脑洞怎么这么多)
显然这样是不行滴,有的机器对于空有不同数据类型的定义,这样定义对于字符是没有问题的
FILE *fp = null则会失败