指针是C/C++中比较难的知识点,对初学者来说非常的绕,不好理解。这里用图形的方法给大家讲解一下. 下图中,我把内存用表格表示,假设左上角数字编号是内存的地址,中间的数字是该地址存的值。
在函数内定义的局部变量,是从栈内存申请的,通过 new 动态申请的内存,是从堆内存申请的。
1. int a = 5; // 定义局部变量a,并初始化为5,系统从栈内存申请一块地址给a,假设地址是91,则91号地址里面存放的值是5
2. int* pA = &a; // 定义了一个局部变量的指针,并初始化为a的地址;系统从栈中申请了一块地址给pA,假设是92,那么92中的值为a的地址91, *pA为91号地址的存放的值(5)
3. int* pB = new int ; // 定义了一个局部变量的指针,并通过new申请了一个堆空间
*pB = 8; // 将pB所指向的地址中的值设置为8
//系统从栈中申请一块空间存放pB(假设地址为93),该地址内只能存放另一个变量的地址。然后系统从堆中申请了一块内存(假设地址为1), 再将pB指向该堆地址,并将所指的内存中的值设置为8
4. 指针的指针,指向指针的地址
int** ppB = &pB; // 定义了一个指针的指针,它存放的是指针pB的地址93
**ppB = ? // ppB 为pB的地址93,*ppB则为pB地址(93)中的值(值为1,也是一个地址),**ppB 为地址1中的值(8)
后面再多的星星都可以以此类推。
下面通过保险柜来通俗有点描述指针,假设保险柜就是内存,保险柜管理员就是系统;
你定义一个变量a(向管理员要一个保险柜,管理员给你一个保险柜,假设编号91) 你对变量赋值,则相当于向这个91号保险柜中放个东西(代号5);
你定义一个指针pA(向管理员要一个保险柜92,但是这个保险柜不能直接放东西,只能放个保险柜编号) 你给这个指针赋值为a的地址(里面存了一个编号91);
你定义了一个指针的指针ppA(向管理员要一个保险柜93,也只能放个保险柜编号), 你赋值为pA的地址(编号93的柜子里)存放了一个pA保险柜的编号92,ppA 保险柜中存的是pA的编号92,*ppA则为92号保险柜中的东西(也是个保险柜的编号91),**ppA的值则为编号91保险柜中存的东西(代号5);