更新时间:2020-09-18 来源:传智播客 浏览量:
之前几篇文章介绍的指针都是一级指针,其实指针还可以指向一个指针,即指针中存储的是另一个指针变量的地址,这样的指针称为二级指针,使用二级指针可以间接修改一级指针的指向,也可以修改一级指针指向的变量的值。
定义二级指针的格式如下:
变量类型 **变量名;
上述语法格式中,变量类型就是该指针变量指向的指针变量所指变量的数据类型,两个符号“*”,表明这个变量是个二级指针变量。
通过二级指针可以直接修改一级指针指向的变量的值,也可以间接修改一级指针的指向。下面以案例的形式介绍二级指针这两方面的作用。
1、通过二级指针间接修改变量的值
下面通过一个案例来演示如何使用二级指针直接修改变量的值,如例1所示。
例1 addr.c
#include <stdio.h>
int main()
{
  int a = 1;         //整型变量
  int* p = &a;        //一级指针p,指向整型变量a
  int** q = &p;       //二级指针q,指向一级指针p
  printf("变量a的地址:%p\n",&a);
  printf("一级指针p的地址:%p\n", p);
  printf("二级指针q存储的值:%p\n", *q);
  printf("二级指针q的地址:%p\n", q);
  **q = 2;          //二级指针间接改变,
  printf("变量a的值%d\n", a);
  return 0;
}例1运行结果如图1所示。

在例1中,指针q是一个二级指针,其中存储一级指针p的地址,而p中存储整型变量a的地址,第11行代码通过间接访问运算符“”间接修改二级指针变量q中存储的指针所指向的值,从而修改变量a的值。由图5-10可知,变量a的值被修改成功。它们之间的逻辑关系如图2所示。

从图2运行结果可以清晰的发现变量a的地址、一级指针p的地址和二级指针存储的地址值是一样的。
2、通过二级指针改变一级指针的指向
二级指针除了直接改变变量的值以外,也可以改变一级指针的指向,下面通过一个案例来演示如何通过二级指针改变一级指针的指向,如例2所示。
例2 poniter.c
#include <stdio.h>
int main()
{
  int a = 1;         //整型变量
  int* p = &a;        //一级指针p,指向整型变量a
  int** q = &p;       //二级指针q,指向一级指针p
  int b = 3;
  printf("变量a的地址:%p\n", &a);
  printf("一级指针p的地址:%p\n", p);
  printf("二级指针q存储的值:%p\n", *q);
  printf("二级指针q的地址:%p\n", q);
  printf("================================\n");
  *q = &b;          //修改一级指针的指向
  printf("变量a的地址:%p\n", &a);
  printf("变量b的地址:%p\n", &b);
  printf("一级指针p的地址:%p\n", p);
  printf("二级指针q存储的值:%p\n", *q);
  printf("二级指针q的地址:%p\n", q);
  printf("指针p指向地址存储的值%d\n", *p);
  return 0;
}例2运行结果如图2所示。

在例2中,第4~5行代码定义int类型变量a,取其地址赋值给一级指针变量p;第6行代码取一级指针变量p的地址赋值给二级指针q,则二级指针q的值是一级指针变量p的内存地址;第8~11行代码分别输出变量a的地址、一级指针p的地址、二级指针q存储的值以及二级指针q的地址。由图2可知,二级指针q存储的值与一级指针p的地址以及变量a的地址是相同的。
在例2中,通过间接访问运算符“”,修改二级指针的指向,即第13行代码使二级指针变量q中保存的一级指针变量p指向变量b。它们之间的逻辑关系如图3所示。

第14~19行代码分别输出变量a的地址、变量b的地址、一级指针变量p的地址、二级指针q存储的值及其地址。从图3的输出结果可以清晰的看到一级指针变量p、二级指针变量q存储的值和变量b的地址是相同的。
猜你喜欢:
1024首播|39岁程序员逆袭记:不被年龄定义,AI浪潮里再迎春天
2025-10-241024程序员节丨10年同行,致敬用代码改变世界的你
2025-10-24【AI设计】北京143期毕业仅36天,全员拿下高薪offer!黑马AI设计连续6期100%高薪就业
2025-09-19【跨境电商运营】深圳跨境电商运营毕业22个工作日,就业率91%+,最高薪资达13500元
2025-09-19【AI运维】郑州运维1期就业班,毕业14个工作日,班级93%同学已拿到Offer, 一线均薪资 1W+
2025-09-19【AI鸿蒙开发】上海校区AI鸿蒙开发4期5期,距离毕业21天,就业率91%,平均薪资14046元
2025-09-19