二级指针:
指针是指针变量的简称,也是变量,是变量就有地址。
指针用于存放普通变量的地址。
二级指针用来存放指针变量的地址。
声明二级指针的语法: 数据类型** 指针名;
使用指针有两个目的:1)传递地址;2)存放动态分配的内存的地址
在函数中,如果传递普通变量的地址,形参用指针;传递指针的地址的地址,形参用二级指针。
#include <iostream>
using namespace std;
int main()
{
int ii = 8; cout << "ii=" << ii << " ii的地址是:" << &ii << endl;
int* pii = ⅈ cout << "pii=" << pii << " pii的地址是:" << &pii <<" *pii="<<*pii<< endl;
int** ppii = &pii; cout << "ppii=" << ppii << " ppii的地址是:" << &ppii << " *ppii=" << *ppii << endl;
cout << "**ppii= " << **ppii << endl;
}
运行结果:
空指针:
在C/C++中,用0或null都可以表示空指针。
声明指针后,在赋值之前,让它指向空,表示没有指向任何空地址。
1)使用空指针的后果
如果对空指针解引用,程序会崩溃。
如果对空指针使用delete运算符,系统将忽略该操作,不会出现异常,所以内存被释放后,也应该把指针指向空。
#include <iostream>
using namespace std;
int main()
{
int* p = 0;
//如果对空指针解引用,系统会崩溃。
//cout << "p= " << p << " *p= " << *p << endl;
//如果对空指针使用delete运算符,系统将忽略该操作,不会出现异常。
delete p; cout << "delete ok.\n";
}
在函数中应该有判断函数是否有空指针的代码,保证程序的健壮性。
2)C++11中的nullptr
用0和null表示空指针会产生歧义,C++11建议用nullptr表示空指针,也就是(void*)0。
野指针
野指针 就是指针指向的不是一个有效合法的地址。
在程序中如果访问野指针,可能会导致程序崩溃。
出现野指针的情况有三种:
1)指针在定义的时候,如果没有进行初始化,它的值是不确定的。
2)如果用指针指向了动态分配的内存,内存被释放后,指针不会置空,但是指的地址已失效
3)指针指向的变量已超越变量的作用域(变量的内存空间已被系统回收)
规避方法:
1)在指针定义的时候,如果没地方指,就初始化为nullptr。
2)动态分配的内存被释放后,将其置为nullptr。
3)函数不要返回局部变量的地址。