chunlanse2014

导航

第十四节 指向指针的指针(十五)

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。在前面已经介绍过,通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“单级间址”。而如果通过指向指针的指针变量来访问变量则构成“二级间址”。


怎样定义一个指向指针型数据的指针变量呢?如下:

    char **p;

p前面有两个*号,相当于*(*p)。显然*p是指针变量的定义形式,如果没有最前面的*,那就是定义了一个指向字符数据的指针变量。现在它前面又有一个*号,表示指针变量p是指向一个字符指针型变量的。*p就是p所指向的另一个指针变量。

从下图可以看到,name是一个指针数组,它的每一个元素是一个指针型数据,其值为地址。name是一个数组,它的每一个元素都有相应的地址。数组名name代表该指针数组的首地址。name+i是mane[i]的地址。name+i就是指向指针型数据的指针(地址)。还可以设置一个指针变量p,使它指向指针数组元素。p就是指向指针型数据的指针变量。


如果有:
  1. p=name+2;
  2. printf(“%d\n”,*p);
  3. printf(“%s\n”,*p);
则,第一个printf函数语句输出name[2]的值(它是一个地址),第二个printf函数语句以字符串形式(%s)输出字符串“Great Wall”。

【例10-36】使用指向指针的指针。
 1 main()
 2 {
 3     char *name[]=
 4     {"Follow me",
 5       "BASIC",
 6       "Great Wall",
 7       "FORTRAN",
 8       "Computer desighn"
 9     };
10     char **p;
11     int i;
12     for(i=0;i<5;i++)
13     {
14         p=name+i;
15         printf("%s\n",*p);
16     }
17 }

 

说明:p是指向指针的指针变量。

【例10-37】一个指针数组的元素指向数据的简单例子。
 1 main()
 2 {
 3     static int a[5]={1,3,5,7,9};
 4     int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
 5     int **p,i;
 6     p=num;
 7     for(i=0;i<5;i++)
 8     {
 9         printf("%d\t",**p);
10         p++;
11     }
12 }

 

说明:指针数组的元素只能存放地址。
 

posted on 2015-04-06 17:19  chunlanse2014  阅读(142)  评论(0编辑  收藏  举报