1. 空指针
含义:指针变量指向内存中编号为0的地址空间。
用途:空指针可用于初始化指针变量。
注意:空指针不能被访问。
#include<iostream>
using namespace std;
int main()
{
int *p = NULL;
cout << &p << endl; //空指针本身的存储地址
cout << p << endl; //空指针对应的地址为0x00
// cout << *p << endl; //错误, 空指针不能被访问
cout << endl;
int a = 10;
p = &a;
cout << &p << endl; //空指针的指向发生变化后,其本身的存储地址不会变化
cout << p << endl; //空指针的指向发生变化后,对应的地址变为变量a的存储地址
cout << *p << endl; //可以访问
system("pause");
return 0;
}
2. 野指针
含义:访问一个已经销毁或内存访问受限的地址空间。
原因:指向变量没有被初始化或者初始化时强行指定内存地址。
注意:野指针会对系统造成不可预知的错误。
#include<iostream>
using namespace std;
int main()
{
int *p = (int*)0x0400;
cout << " 野指针本身的存储地址:" << &p << endl; //野指针本身的存储地址,系统会分配内存空间
cout << " 野指针指向的地址: " << p << endl; //野指针指向的地址为0x0400
// cout << *p << endl; //错误, 野指针不能被访问
cout << endl;
system("pause");
return 0;
}
3. 悬垂指针
含义:指针指向的对象已经被销毁,但指针依然存在,属于野指针的一种。
原因:指向变量没有被初始化或者初始化时强行制定内存地址。
注意:出现悬垂指针并不会报错,但对结果会造成不可预知的错误。
#include<iostream>
using namespace std;
int *p = NULL;
void func()
{
int a = 10;
p = &a;
}
int main()
{
func();
cout << *p << endl; //指针指向变量a的地址 ,输出 10
cout << *p << endl; //指针指向的对象已经被释放,成为悬垂指针 随机输出 2027674496
cout << *p << endl; //输出2027674497
cout << *p << endl; //输出2027674497
cout << endl;
system("pause");
return 0;
}