C++中关于指针的知识点
什么是指针
在C++中,每定义一个变量,系统就会给变量分配一块内存,内存相当于系统为存放变量开辟的房间,而且内存是有地址的,可以把地址理解成为门牌号。指针就像是把钥匙,能够打开与之匹配的大门。所以通过指针,你能访问与之相对应的内存空间,修改里面存放的数据。在C++中用*(星号)表示指针。
同时,*运算符被称为间接值或者解除引用(解引用)运算符,它用与指针,可以得到该地址的内存中存储的值,*也是乘法符号,C++根据上下文来确定*的具体含义。
const修饰指针
1)常量指针:const 数据类型 *变量名
含义:不能通过解引用的方法修改内存地址中的值,用被指向的变量名可以改
2)指针常量:数据类型 *const 变量名(能改值,不能改指向)
含义:指向的变量不可改变,但可以修改内存地址中的值
3)常指针常量:const 数据类型 *const 变量名(值和指向都不能改)
含义:指向的对象不能改变,也不能通过解引用的方法修改内存地址中的值
什么是二级指针
1)用于存放指针变量的地址
2)二级指针的语法:数据类型 **指针名
3)应用场景:在函数中,如果传递普通变量的地址,形参用指针;传递指针的地址,形参用二级指针。把普通变量的地址传入函数后可以在函数中修改变量的值;把指针的地址传入函数后可以在函数中修改指针的值。
什么是空指针
2)C和C++中用0或NULL都可以表示空指针,C++11中nullptr也可(建议这样写)
2)注意:如果对空指针解引用,程序会崩溃,所以一定要判空。在内存释放后,应将指针指向空
什么是野指针
1)野指针就是指针指向的不是一个有效的地址,访问野指针可能会造成程序崩溃
2)野指针出现情况: 指针在定义的时候,没有进行初始化,值不确定;若指针指向了动态分配的内存,内存被释放以后,指针没有置空,但指向的地址已经失效;指针指向的变量已超越变量作用域(变量的内存空间已被系统回收)
3)规避野指针的方法:指针在定义的时候,如果没地方指,就初始化为nullptr;动态分配的内存被释放后,将其置为nullptr;函数不要返回局部变量的地址;使用智能指针
函数指针
1)使用步骤:1.声明函数指针 2.让函数指针指向函数的地址 3.通过函数指针调用函数声明函数指针时,必须提供函数类型,函数类型是指函数的返回值和参数列表
2)语法:
int func(int a,string b);
int (*pfunc)(int,string);
pfunc = func;
指针的算数
指针变量+1后,增加的量等于它指向的数据类型的字节数
this指针
1)每个成员函数(包括构造函数和析构函数)都有一个this指针,可以用它访问调用者对象的成员。
2)this指针存放了对象的地址,它被作为隐藏参数传递给了成员函数,指向调用成员函数的对象(调用者对象)

