1. 程式人生 > >指向二維數組元素的指針變量

指向二維數組元素的指針變量

數據 指針 數組的指針 定義 輸入 alt == turn urn

  (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)有4個元素,每個元素為整型.也就是p所指向的對象是有4個整型元素的數組,即p是指向一維數組的指針.p的值是該一維數組的起始地址.

  註意p的類型是int (*)[4],p指向的一維數組的長度是16字節,所以p每增加1,地址就增加16字節.

  技術分享

指向二維數組元素的指針變量