1. 程式人生 > >C語言:使用指標操作二維陣列

C語言:使用指標操作二維陣列

任務程式碼:

(1)用指向二維陣列元素的指標:

#include <stdio.h>
int main( )
{
    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    int *p;
    for(p=a[0];p<a[0]+12;p++)
    {
        printf("%3d ",*p);
    }
    return 0;
}


(2)陣列指標:指向一維陣列的指標變數

#include <stdio.h>
int main( )
{
    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    int i,j,(*p)[4];//定義一個指向有四個元素的一維陣列的指標
    
    for(p=a,i=0;i<3;i++,p++) //i用於計算行數
    {
        for(j=0;j<4;j++)
        {
           printf("%3d ",*(*p+j));//!!尤其注意,這裡的p儲存的是a行整體的地址指向一維陣列a[0]整體,而不是指向一個具體的值!
                                  //*p的值取出來的值就是a[0][0]的地址,*p+j就是儲存a[0][j]行的地址,
                                  // *(*p+j)就是該地址指向的元素的值!!
        }
        printf("\n");
    }
    return 0;
}

第二種寫法:(含義不同)

#include <stdio.h>

int main( )
{
    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    int i,j,(*p)[4];
    
    p=a[0];//p儲存a[0]行整體的地址,*p指向a[0]一維陣列整體
    
    for(i=0;i<3;i++) //i用於計算行數
    {
        for(j=0;j<4;j++)
        {
            printf("%3d ",*(*(p+i)+j));//p指向一維陣列整體,(p+i)代表指向每一行的一維陣列,
                                       //*(p+i)取值代表每一行一維陣列第a[i][0]個元素的地址
                                       //*(p+i)+j代表每一行a[i][j]的地址
                                       //*(*(p+i)+j)代表a[i][j]的值
        }
        printf("\n");
    }
    return 0;
}


(3)指標陣列:

#include <stdio.h>

int main( )
{
    int b[2][3]={{1,2,3},{2,4,6}};
    int *pb[2];
    
    int i,j;
    pb[0]=b[0];//pb[0]儲存b[0]行一維陣列首元素b[0][0]地址,*pb指向b[0]首元素
    pb[1]=b[1];//pb[1]儲存b[1]行一維陣列首元素b[1][1]地址,*pb指向b[1]首元素
    
    for(i=0;i<2;i++)//用於記錄行數
    {
        for(j=0;j<3;j++,pb[i]++)//pb[i]++代表在b[i]行的基礎下,訪問b[i][j]元素的值
        {
            printf("%2d ",*pb[i]);
        }
    }
    
    
  return 0;
}


知識總結:

(1)用指向二維陣列元素的指標:


(2)陣列指標:指向一維陣列的指標變數!

         陣列指標是一個指標,但是指向的不是一個元素,而是指向一維陣列整體!


例子1(第一種寫法):


例子2(第二種寫法):


(3)指標陣列:(注意區別與陣列指標的不同)


指標陣列去訪問二維陣列;