天天看點

c語言程式二維數組,C語言二維數組通路

假設存在下面一個數組,要求用函數通路該數組

int a[2][3]=

{

{1,2,3},

{4,5,6},

};

1.

void show_array(int *a,int M,int N)

{

inti,j;

for(i=0;i

{

for(j=0;j

{

printf("%d ",*(a+i*N+j));

}

printf("\n");

}

}

二維數組裡面的某一行的第一個元素的位址也代表了本行的位址,具有雙重身份

二維數組名也是一個位址,就是a=a[0]=&a[0][0]

二維數組作為形式參數,a是一個一階指針,用來存儲普通變量的位址

這個函數是通過a,數組第一個元素的位址,然後自己計算行列來周遊通路二維數組。

show_array(a,3,3);//vs2012不可行

show_array(a[0],3,3);

show_array((int*)a,3,3);//強制類型轉化二階轉化一階

show_array(*a,3,3);//*a表示a[0];

下面的不對,本來以為二維數組就應該和二階指針對應,後來發現不是。

二階指針存儲的必須是一個指針變量的位址。但是a[0]是一個位址常量,

表示的是數組第一行的位址,隻是在數值上滿足*a=&a[0][0]=a[0];

是以下面錯了。在main函數中直接傳遞show(a,3,3)類型根本就不符合

void show_array(int **a,int M,int N)

{

inti,j;

for(i=0;i

{

for(j=0;j

{

printf("%d ",*(*(a+i)+j));

}

printf("\n");

}

}

在二維數組做形式參數的時候第二維不可省略,這裡傳遞了一個指針數組,來存儲每一行

的行首位址。是以正确,傳遞時候的參數是show_array2(a,3);

void show_array2(int (*a)[3],int M)

{

inti,j;

for(i=0;i

{

for(j=0;j<3;j++)

{

//printf("%d ",a[i][j]);

printf("%d ",*(a[i]+j));

}

printf("\n");

}

}

如果一定要用二階指針通路二維數組,需要先用一階指針數組先存儲每一行的首位址,然後在用二階指針存儲一階指針的位址,這是在主函數裡面實作的。

int *p[2] = {a[0], a[1]};

int **pp = p;

然後就可以利用二階指針pp進行通路了。