6.6 NULL指针
标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。要使一个指针变量为NULL,可以给它赋一个零值。为了测试一个指针变量是否为NULL,可以将它与零值进行比较。之所以选择零这个值,是因为一种源代码的约定。就机器内部而言,NULL指针的实际值可以与此不同。在这种情况下,编译器将负责零值和内部值之间的翻译转换。
NULL指针的概念是非常有用的,因为它给了你一种方法,可以表示某个特定的指针目前并未指向任何东西。例如,一个用于在某个数组中查找某个特定值的函数可能返回一个指向查找到的数组元素的指针。如果该数组不包含指定条件的值,函数就返回一个NULL指针。这个技巧允许返回值传达两个不同片段的信息。首先,有没有找到元素?其次,如果找到,它是哪个元素?
提示:
尽管这个技巧在C程序中极为常用,但它违背了软件工程的原则。用单一的值表示两种不同的意思是件危险的事,因为将来很容易无法弄清哪个才是它真正的用意。在大型的程序中,这个问题更为严重,因为你不可能在头脑中对整个设计一览无余。一种更为安全的策略是让函数返回两个独立的值:首先是个状态值,用于提示查找是否成功;其次是个指针,当状态值提示查找成功时,它所指向的就是查找到的元素。
对指针进行解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西。因此,对一个NULL指针进行解引用操作是非法的。在对指针进行解引用操作之前,首先必须确保它并非NULL指针。
警告:
如果对一个NULL指针进行间接引用会发生什么情况呢?它的结果因编译器而异。或许隐匿了它的症状,或者引发了一个错误,并终止程序。
提示:
如果所有的指针变量(而不仅仅是位于静态内存中的指针变量)能够被自动初始化为NULL,那实在是件幸事,但事实上并非如此。不论你的机器对解引用NULL指针这种行为作何反应,对所有的指针变量进行显式的初始化是种好做法。如果已经知道指针将被初始化为什么地址,就把它初始化为该地址,否则就把它初始化为NULL。风格良好的程序会在指针解引用之前对它进行检查,这种初始化策略可以节省大量的调试时间。
C和指针 第6章 指针 6.6 NULL指针
于 2022-06-14 22:37:18 首次发布