下面这个代码说明了一个极为常见的错误:
int *a;
...
*a = 12;
警告:究竟a应该指向哪里。我们声明了这个变量,但从未对它进行初始化,所以我们没有办法预测12这个值存储于什么地方。从这一点看,指针变量和其他变量并无区别,如果变量是静态的,它会被初始化为0.但如果变量是自动的,它根本不会被初始化。无论哪种情况,声明一个指向整形的指针都不会创建用于存储整型值的内存空间。
NULL指针
标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。要使一个指针变量为NULL,你可以给它赋一个零值。为了测试一个指针变量是否为NULL,你可以将它与零值进行比较。之所以选择零这个值是因为一种源代码约定,就机器内部而言,NULL指针的实际值肯呢过与此不同。在这种情况下,编译器将负责零值与内部值之间的翻译转换。
NULL指针的概念是非常有用的,因为它给了你一种方法,表示某个特定的指针目前尚未指向任何东西。例如,一个用于在某个数组中查找某个特定值得函数可能返回一个指向查找到的数组元素的指针。如果该数字不包含指定条件的值,函数就返回一个NULL指针。这个技巧允许返回值传达两个不同片段的信息。首先,有没有找到元素,其次,如果找到,它是哪个元素。
对指针进行解引用操作可以获得它所指向的值,但从定义上看,NULL指针并未指向任何东西,因此,对一个NULL 指针进行解引用操作是非法的,在对指针进行解引用操作之前,你首先必须确保它并非NULL指针。
其实如果声明一个数组的话,默认会赋值为0!