- 引入
先来看一段代码
//代码6.1#include <iostream>int main(){using namespace std;int i = 30;int *pi;int **ppi;pi = &i;*ppi = pi;cout << i << endl;cout << pi << endl;cout << *pi << endl;cout << ppi <<endl;cout << *ppi << endl;cout << **ppi << endl;return 0;}
程序运行结果如下图所示
分析一下,我们声明整型变量i = 30;内存“开辟”一块空地给它,而且内存起始地址是0xffffcc2c;接着,我们声明一个指向整型变量的指针pi, 一个指向int 类型指针变量的地址的指针pi;第11行代码后,结合运行结果,我们可以看出指针变量pi的内存起始地址是0xffffcdf0, 也就是说指针变量 ppi 的内容就是指针变量 pi 的起始地址 。那么*ppi的结果就是指针变量pi的值,pi的结果就是i的值,也就是*pi的值。
大致画出内存地址的图示
- 一个例子
设计一个函数:void find(char array[], char search, char **ppa)
要求:这个函数参数中的数组 array 是以 0 值为结束的字符串,要求在字符串 array 中查找字符是参数 search 里的字符。如果找到,函数通过第三个参数 (pa)返回值为 array 字符串中第一个找到的字符的地址。如果没找到,则为 pa 为 0
代码6.2#include <iostream>void find(char array[],char search,char **ppa);int main(){using namespace std;char str[] = {"afsdfsdfdf\0"}; /* 待查找的字符串 */char a;a = 'z';char *p = nullptr;find(str, a, &p);if (0 == *p){cout << "没有找到" << endl;}else{cout << "已经找到 "<< &p<< endl;}return 0;}void find(char array[],char search,char **ppa){using namespace std;int i;for (i=0; *(array + i) != 0; i++){if(*(array + i) == search){*ppa = array + i;break;}else if(*(array + i) == 0){*ppa = nullptr;break;}}}
分析一下, ppa 指向指针 p 的地址。 对*ppa 的修改就是对 p 值的修改
