空指针(NULL)
1. 什么是空指针
在语言定义中,每种指针类型都有一个特殊值---“空指针”---它与同类型的其他指针都不同,它“保证与任何函数或对象的指针值都不相等”。
直白点就是说:它不指向任何地方,它不是任何对象或函数的地址。这样取地址符&对空指针无效。
空指针和未初始化的指针不同,未初始化的指针危害巨大,未初始化的指针乱起一气,所以俗称“野指针”!
2. 空指针的形成
语言定义:在指针上下文中的“值为0的整型常量表达式”会在编译时转换为空指针。
白话文:在初始化,赋值或者比较的时候,如果一边是变量或者指针类型的表达式,而另一边是0,那么编译器就会确定这是一个空指针,并且会生成正确的空指针值。下面的代码合法:
char *p = 0;
if( p != 0 )
如果需要在空指针作为函数的实参,那么需要进行显式的转换。
例如:
void f(int a, char *p)
{
…
}
…
void main()
{
int b;
f(b, (char *)0);
…
}
3. 空指针的应用
检查空指针是否有效的语法很多,不多原理都一样,下面都是合法的:
char *p = 0;
1if( p )
2if( p == 0 )
3if( p != 0 )
4if(!p)
4. 关于0和NULL
当请求了一个空指针时,无论我们写成了“0”还是NULL,编译器都生成适合机器的空指针的位模式。当请你尽量用NULL,这样大家都能刚好的明白这是一个空指针。
数组和指针
1. 指针和数组等价性
在C语言中指针和数组等价的意思是指针算术和数组下标运算等价,指针和数组是不同的。
实际上当我们定义了一个数组,比如a[2]时,编译器在编译时,就已经将其退化为一个指针a.
2. 指针和数组的区别:
数组是一个由(同一个类型的)连续元素组成的预先分配的内存块,而指针是一个对任何位置(特定数据类型)的数据元素的引用。
数组自动分配内存空间,但不能重新分配或改变大小。指针必须被赋值以指向被分配的内存空间(malloc也算),可以重新被赋值,当然指针还有其他很多用途。