C 语言空指针 NULL 以及 void 指针
shuimanting520 2016-05-10 07:12:12 18926 珍藏 30
分类专栏:C/C++ 文章标签:C++ 指针 void NULL
版权
空指针 NULL
在 C 语言中,如果一个指针不指向任何数据,咱们就称之为 空指针,用 NULL 示意。例如:
int *p = NULL;
留神辨别大小写,null 没有任何非凡含意,只是一个一般的标识符。
NULL 是一个宏定义,在 stdio.h 被定义为:
define NULL ((void *)0)
(void )0 示意把数值 0 强制转换为 void 类型,最外层的 () 把宏定义的内容括起来,咱们本人进行宏定义时也举荐这么做,避免产生歧义。
总之,p 的值为 0。你能够输入 p 的值:
#include <stdio.h>
int main(){
int *p = NULL;
printf("%d\n", p);
return 0;
}
运行后果:
0
咱们晓得,变量一旦定义就要分配内存,指针变量也是如此。例如:
int *p; // 它不是空指针
它的值是随机的,是垃圾值,如果不小心应用了它,运行时个别会引起段谬误,导致程序退出,甚至会人不知; 鬼不觉地批改数据。
p 通过定义,就肯定在内存中调配了 4 个字节(32 位环境)的空间,只是它的值是随机的,不像 int 会被初始化为 0,然而它的确指向了一段失常应用的内存。应用 p 时,操作的就是这段内存的数据,侥幸的话可能失常运行,不过大部分状况下这段内存是无权操作的。
NULL 使 p 指向地址 0。大多数零碎中都将 0 作为不被应用的地址,所以吴用 p 也不会破坏数据。
但并非总是如此,也有零碎会应用地址 0,而将 NULL 定义为其余值,所以不要把 NULL 和 0 等同起来,上面的写法也是不业余的:
int *p = 0;
而应该保持写为:
int *p = NULL;
留神 NULL 和 NUL 的区别:NULL 示意空指针,是一个宏定义,能够在代码中间接应用。而 NUL 示意字符 '\0',也就是字符串完结标记,它是 ASCII 码表中的第 0 个字符。NUL 没有在 C 语言中定义,仅仅是对 '\0' 的称说,不能在代码中间接应用。
void 指针
C 语言还有一种 void 指针类型,即能够定义一个指针变量,但不阐明它指向哪一种类型数据。例如:
void *p = malloc(2);
在内存中调配 2 个字节的空间,但不确定它保留什么类型的数据。
留神,void 指针与空指针 NULL 不同:NULL 阐明指针不指向任何数据,是“空的”;而 void 指针实实在在地指向一块内存,只是不晓得这块内存中是什么类型的数据。