假設存在下面一個數組,要求用函數通路該數組
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進行通路了。