我们在使用指针的时候,总是会遇到各种稀奇古怪的问题,但万变不离其宗,下面我们一起来学习指针的各种状态。
野指针野指针(wild pointer)就是没有被初始化过的指针。
【示例:】
#includeint main() { int *p; printf("%dn",*p); return 0; }
如果用Vs编译,会直接报错error C4700: 使用了未初始化的局部变量“p”,还是比较人性的,从根本上避免了野指针。
空指针空指针就是被赋值为NULL的指针,它不指向任何的对象或者函数。(坚决不能使用空指针,否则程序就会崩)
空指针的出现是为了避免错误的引用指针而导致的难以排查的问题,不过空指针也不能直接访问,但是可以用来判断。
【示例:】
#includeint main() { int* p = NULL; //判断指针是否为NULL if (p != NULL) { printf("%dn", *p); } return 0; }
如果把指针值为空,则可以进行判断,就算没有判断,直接对空指针进行引用,产生的报错也非常好理解。
悬空指针*悬空指针是指针最初指向的内存已经被释放了的一种指针。
【示例:】从函数中返回临时变量的地址
#includeint* foo() { int age = 18; //函数执行完毕,age的内存会被自动释放 return &age; } int main() { int* p = foo(); //getchar(); printf("%dn", *p); return 0; }
运行上面的代码,貌似没有任何问题,的确如此,但不代表这个代码是正确的。现在我们把main函数中的getchar的注释放开,然后重新运行程序,等待几秒之后按下任意键,发现输出的结果已经不对了。
为什么?一开始的时候我们没有getchar,foo函数返回之后,接着立马输出*p,这个时候函数里面的age还没有来得及释放,所以输出没问题,但是当我们使用getchar等待一段时间后,age有足够的时间释放了,所以就会输出垃圾值。
注意:悬空指针是编码过程中最容易出现问题的,切记,认真检查!
万能指针void* 类型的指针又叫万能指针,他可以指向任意的内存空间地址。
1. 可以指向任何地址
int maye = 20; void* p = &maye;
2. 可以隐式自动转换为其他类型指针
int* pi = p;
3. 不能对void*取值操作,因为它没有类型,或者说不能判断存储的是什么类型,需要强转指定一个确定的类型才能使用
printf("%dn",*p); //error
printf("%dn",*(int*)p);//right



