1. 引入

    先来看一段代码

    1. //代码6.1
    2. #include <iostream>
    3. int main()
    4. {
    5. using namespace std;
    6. int i = 30;
    7. int *pi;
    8. int **ppi;
    9. pi = &i;
    10. *ppi = pi;
    11. cout << i << endl;
    12. cout << pi << endl;
    13. cout << *pi << endl;
    14. cout << ppi <<endl;
    15. cout << *ppi << endl;
    16. cout << **ppi << endl;
    17. return 0;
    18. }

    程序运行结果如下图所示
    image.png
    分析一下,我们声明整型变量i = 30;内存“开辟”一块空地给它,而且内存起始地址是0xffffcc2c;接着,我们声明一个指向整型变量的指针pi, 一个指向int 类型指针变量的地址的指针pi;第11行代码后,结合运行结果,我们可以看出指针变量pi的内存起始地址是0xffffcdf0, 也就是说指针变量 ppi 的内容就是指针变量 pi 的起始地址 。那么*ppi的结果就是指针变量pi的值,pi的结果就是i的值,也就是*pi的值。
    大致画出内存地址的图示
    指向指针的指针 - 图2

    1. 一个例子

    设计一个函数:void find(char array[], char search, char **ppa)
    要求:这个函数参数中的数组 array 是以 0 值为结束的字符串,要求在字符串 array 中查找字符是参数 search 里的字符。如果找到,函数通过第三个参数 (pa)返回值为 array 字符串中第一个找到的字符的地址。如果没找到,则为 pa 为 0

    1. 代码6.2
    2. #include <iostream>
    3. void find(char array[],char search,char **ppa);
    4. int main()
    5. {
    6. using namespace std;
    7. char str[] = {"afsdfsdfdf\0"}; /* 待查找的字符串 */
    8. char a;
    9. a = 'z';
    10. char *p = nullptr;
    11. find(str, a, &p);
    12. if (0 == *p)
    13. {
    14. cout << "没有找到" << endl;
    15. }
    16. else
    17. {
    18. cout << "已经找到 "
    19. << &p
    20. << endl;
    21. }
    22. return 0;
    23. }
    24. void find(char array[],char search,char **ppa)
    25. {
    26. using namespace std;
    27. int i;
    28. for (i=0; *(array + i) != 0; i++)
    29. {
    30. if(*(array + i) == search)
    31. {
    32. *ppa = array + i;
    33. break;
    34. }
    35. else if(*(array + i) == 0)
    36. {
    37. *ppa = nullptr;
    38. break;
    39. }
    40. }
    41. }

    分析一下, ppa 指向指针 p 的地址。 对*ppa 的修改就是对 p 值的修改