一、空指针的理解
1、指针定义后要声明,不然就是野指针。
2、指针的值是0,意味着该指针是空指针。
为什么是这样,因为NULL在C++中是个宏定义:
//Define NULL pointer value
#ifndef NULL
# ifdef __cplusplus
# define NULL 0
# else
# define NULL ((void *)0)
# endif
#endif //NULL
二:空指针&野指针
1、空指针:
(1)
没有存储
任何
内存地址
的指针就称为空指针(NULL指针)。
(2)
初始化一个空指针:
int *ip = NULL;
(3)
校验一个指针是否为一个有效指针时,更倾向于用这种方式
:
if(ip != NULL)
2、野指针:
“野指针”不是NULL指针,是指向"垃圾“内存的指针。
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,他的缺省值是随机的,它会乱指一气。所以指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如:
char *p = NULL;
char *str = (char *)malloc(100);
(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
(指针定义原理:定义指针,分配内存,指针指向内存)
free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾, p成了”野指针”。如果此时不把p置为NULL,会让人误以为p是个合法的指针。如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用if(p!=NULL)进行放错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
char *p = (char *)malloc(100);
strcpy(p, "hello");
free(p); //p所指的内存被释放,但是p所指的地址仍然不变
if(p!=NULL) //没有起到放错作用
{
strcpy(p, "world"); //出错
}
(3)指针操作超越了变量的作用范围,这种情况让人防不胜防,示例程序如下:
class A{
public:
void Func(void){cout<<"Func of class A" <<endl;}
};
void Test(void){
A *p;
{
A a;
p = &a; //注意a的生命周期,只要这个程序块中(花括号里的两行),而不是整个test函数
}
p->Func(); //p是“野指针”
}
函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了”野指针“。
三、void *
(在C语言里void*是个很有意思的东西)
含义:
void *可以叫做:
不确定类型的指针
,void* 可以用来声明指针。如:void *a;
1、(
不确定类型可以意味)
void*可以接受任何类型的赋值
:
void *a = NULL;
int *b = NULL;
a = b
; //a是void* 型指针,任何类型的指针都可以直接赋值给他,无需进行强制类型转换。我们可以认为void是一张白纸,可以在上面写任何类型的数值。
2、void *可以赋值给任何类型的变量 但是需要进行强制转换(前提是void *已被指定内存地址):
int * a = NULL;
void *b;
a = (int *)b;
(部分源于网络整理,如有侵权,请联系liujiaqiziv@163.com)