指向二维数组元素的指针变量

  (1)指向数组元素的指针变量

  例1.有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值.

  编写程序

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
 5     int *p;
 6     for (p = a[0]; p < a[0] + 12; p++)   //a[0]代表列指针的起点,p依次指向下一个元素
 7     {
 8         if ((p - a[0])%4 == 0)
 9         {
10             printf("\n");            //%4 ==0,先换行再输出元素
11         }
12         printf("%4d  ", *p);
13 
14     }
15     return 0;
16 }

  本例是顺序输出数组中各元素之值.若要输出指定的某个数值元素(如a[2][3]),可以通过相对位置来计算.a[i][j]在数组中的相对位置的计算公式为i*m+j.所以a[2][3]的地址是(p+2*4+3),即(p+11).

  (2)指向由m个元素组成的一维数组的指针变量

  上例中p是int * p,指向整形数据,p+1所指元素是p所指列元素的下一个元素.

  可以改用另一种方法,使p指向一个包含m个元素的一维数组.这时,如果p先指向a[0](即p=&a[0]),则p+1指向a[1],p的增值以一维数组的长度为单位.如下图

      

  例2. 输出二维数组任一行任一列元素的值.

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
 5     int(*p)[4], i, j;
 6     p = a;        //p指向二维数组的0行
 7     printf("please enter row and colum:");
 8     scanf_s("%d,%d", &i, &j);    //2个%d之间的分隔符要和输入时的保持一致
 9     printf("a[%d][%d] = %d",i, j, *(*(p + i) + j));
10     return 0;
11 }

    程序分析:程序第5行中的int(*p)[4]表示定义p为一个指针变量,它指向包含4个整型元素的一维数组.注意*p两侧的括号不可缺少,如写成*p[4],则代表指针数组.

  对(*p)[4]的理解,可以做出下面的比较:

  ①int a[4];(a有4个元素,每个元素为整型)

  ②int (*p)[4];(可理解为*p是int[4]类型,指向含有4个元素的数组的指针)

  第②种形式表示 (*p)有4个元素,每个元素为整型.也就是p所指向的对象是有4个整型元素的数组,即p是指向一维数组的指针.p的值是该一维数组的起始地址.

  注意p的类型是int (*)[4],p指向的一维数组的长度是16字节,所以p每增加1,地址就增加16字节.

  

 

posted @ 2017-08-17 11:40  心媛意码  阅读(599)  评论(0编辑  收藏  举报