对NULL指针的定义:
NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。
如何测试一个指针变量是否为NULL?
要使一个指针变量称为NULL,你可以给它赋一个0值。
然后将它与0值进行比较,之所以选择0这个值,是因为这是一种源代码约定。
就机器内部而言,NULL指针的实际值可能与此不同。
在这种情况下编译器0值和内部值之间的翻译转换。
NULL指针的概念非常有用!
因为它提供给你一种方法,表明某个特定的指针目前没有指向任何东西。
例如:一个在某个数组里查找某个特定值的函数。
- 如果数组包含指定条件的值,那么会返回一个指向查找到的数组元素的指针。
- 如果该数组不包含指定条件的值,函数就返回一个NULL指针。
这个技巧允许返回值传达两个不同片段信息:
- 首先,是否找到?
- 其次,如果找到,那么它是哪个?
提示:
尽管这种技巧在C语言中经常使用,但它违背了软件工程的原则,用一个单一的值表示两个不同的意思是一件危险的事,因为将来很容易混淆它的真正意图。
更为安全的策略是让函数返回两个独立的值:
- 首先是状态值,用于提示查找是否成功;
- 其次是个指针,当状态值提示查找成功时,它所指向的就是查找到的元素;
注意!
对指针进行解引用可以获得它所指向的值。但从定义上看,NULL并未指向任何东西。因此,对一个NULL指针进行解引用是非法的。在对指针解引用前你得首先确保它并非NULL指针。
如果对一个NULL指针进行间接访问会发生什么情况?
再有些机器上,它会访问内存位置零。编译器能够确保内存位置零没有存储任何变量,此时机器并未阻止你访问或修改此位置的值。这种行为是非常不幸的,因为程序包含了一个错误,但机器却隐匿了它的症状,这样使得错误更加难以寻找。
在另一些机器上,对NULL指针进行间接访问会引发一个错误,并终止程序。这显然比上一种情况好得多,因为程序员可以及时修正这个错误。
END!