- 引入
先来看一段代码
//代码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 值的修改