前言:C++系列之指针!
1.指针
指针是用来保存内存地址的变量。
2.用指针来保存地址
2.1 指针与类型变量
从上面我们可以看到指针P1指向的a为int类型,指针P2指向的b为double类型。当我们分别把指针P1,P2分别加一时,
根据输出的结果可以看出,P1前后的变化是移动了4个字节,P2前后的变化是移动了8个字节(拿出计算机计算就知道了)。
当我们在后端加入P2=P1,编译报错,这是为什么了?因为他俩指针指向的类型不同,这也是它编译不过的原因。
指针的类型必须与它所指向的变量的类型相匹配。假如不相匹配,那么就会报错。
2.2 指针的地址与指针中保存的某个变量的地址
我们可以看到,经过P=&i的变换,无论是i或者是P他们自身的地址都保持不变(这里的P的地址是P的内存地址),但是P的值发生了改变。
2.3 更换指针保存的地址
这样我们就通过了改变指针保存的地址从而改变获取到的值。
3.为什么使用指针
先介绍两种最主要的两种
1、栈区:由编译器自动分配且释放,该区一般存放函数的参数值和局部变量
2、堆区:一般由程序员分配和释放,程序员不释放,程序结束后由操作系统自动回收、释放。
三、对于栈区的局部变量和参数当程序一旦运行完后,就会被系统自动释放并且清除。所以当程序运行,函数调用完毕时需要反回该函数中的局部变量和方法的参数值时无法做到。虽然全局变量可以解决这个问题,全局变量可以被整个类的成员函数共享,所以很容易被改变之。
而堆可以很好的解决这一问题。
四、堆内存的使用示例,使用new关键字创建堆内存,堆内存是匿名的,所以要用指针保存这个堆内存单元的地址,方便该堆内存空间下数据访问。
#include <iostream>
using namespace std;
int main()
{
//让p指针指向一个double类型的堆内存空间分配8个字节
double *p = new double;
//向p指针所指向的堆内存空间中写入数据
*p = 1.44;
cout<<*p<<endl;
//让p指针释放指向的堆内存
p = NULL;
//输出p指针现在的指向
cout<<p<<endl;
return 0;
}
4.指针的常见错误
先看一段代码: