如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。

    假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示:

    铁律2-从1级指针到2级指针推演 - 图1

    1. int a =100;
    2. int *p1 = &a;
    3. int **p2 = &p1

    指针变量也是一种变量,也会占用存储空间,也可以使用&获取它的地址。

    C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。

    • p1 是一级指针,指向普通类型的数据,定义时有一个*;
    • p2 是二级指针,指向一级指针 p1,定义时有两个*。
    1. void getMem(char **p2)
    2. {
    3. *p2 = 400; //间接赋值 p2是p1的地址
    4. }
    5. void getMem2(char *p2)
    6. {
    7. p2 = 400; // p2跟p1没有关系,不会影响实参
    8. }
    9. //二级指针
    10. void main()
    11. {
    12. char *p1 = NULL;
    13. char **p2 = NULL; //二级指针
    14. p1 = 0x11;
    15. p2 = 0x22;
    16. //直接修改p1的值 (栈)
    17. p1 = 0x111;
    18. //间接修改p1的值
    19. p2 = &p1;
    20. *p2 = 100;//间接赋值 p2是p1的地址
    21. printf("p1:%d \n", p1); //100
    22. getMem(&p1);
    23. printf("getMem p1:%d \n", p1); //400
    24. getMem2(&p1);
    25. printf("getMem2 p1:%d \n", p1); //400
    26. system("pause");
    27. return;
    28. }