如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
前面已经介绍过,通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“单级间址”或“一级指针”。而如果通过指向指针的指针变量来访问变量则构成“二级间址”,或者称为“二级指针”。如图7.33所示,实际上就是指向指针的指针。
图7.33 一级指针与二级指针
二级指针的定义格式为:
数据类型**指针变量名称
其中,指针名前有两个“*”,表示是一个二级指针。
例如,有如下定义:
char**p;
表示指针变量p是一个指向字符型指针的指针变量。
与定义一级指针变量相同,语句中的类型也是基本类型,即最终存放数据的普通变量的类型,因此,普通变量、一级指针变量、二级指针变量可以同时定义。
例如:
int**p1,*p2,a;
假设有如下定义:
int a,*p1a,**p2a;
p1a=&a;
p2a=&p1a;
指针p1a存放变量a的地址,即指向了变量a;指针p2a存放一级指针p1a的地址,即指向了p1a。因此,p1a是一级指针,p2a是二级指针。对于变量a的访问,既可以用一级指针p1a来访问,也可以用二级指针p2a来访问,即a、*p1a、**p2a都表示访问变量a的值,三者是等价的。
为指针变量赋地址值时级别不能弄错,即一级指针变量只能取得普通变量的地址,二级指针变量只能取得一级指针变量的地址。在二级指针变量已取得一级指针变量的地址,且一级指针变量已取得普通变量地址的前提下,就可以通过二级指针变量访问普通变量,方法是用两个连续的指向运算符“**”。
指向指针的指针通常和指针数组结合一起使用。
【例7.28】(www.xing528.com)
程序内容如下:
1 #include<stdio.h>
2 void main()
3 {
4 int i;
5 char*p Array[]={"One","Two","Three"};
6 char**p;
7 p=p Array;
8 for(i=0;i<3;i++,p++)
9 printf("%s",*p);
10 printf("\n");
11 }
程序结果如图7.34所示:
图7.34 例7.28程序结果图
【例题中关键问题说明】
p Array为指针数组,其中每一个数组元素均为指针,指向对应字符串的首地址。而p是一个指向指针的指针变量。语句“p=p Array”使p指向数组元素p Array[0],而*p为p Array[0]的内容。因为p Array[0]存放的是字符串“One”的首地址,因此输出字符串时,可以直接使用语句“printf("%s",*p)”。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。