指針、函數、二維數組之間的聯系
阿新 • • 發佈:2017-06-17
尋址 code 如果 存儲 col 變量 準備工作 num 需要
1.傳遞數組指針
1 #include <stdio.h> 2 void output( int (*pa)[3], int n )//這個函數只能輸出n行3列的二維數組 3 { 4 int i,j; 5 for( i=0;i<n;i++ ){ 6 for( j=0;j<3;j++ ) 7 printf("%d ", pa[i][j] ); 8 printf("\n"); 9 } 10 } 11 void main() 12 { 13 int a[2][3]={ 14 {1,2,3}, 15 {4,5,6} 16 }; 17 output(a,2); 18 }
2.傳遞“指針數組” 先將二維數組的行指針存儲到一個指針數組中,再將指針數組傳遞到子函數中去
1 #include <stdio.h> 2 void output( int *pa[], int row,int col ) //這個函數更通用,但調用前,要做好準備工作。 3 { 4 int i,j; 5 for( i=0;i<row;i++ ){ 6 for( j=0;j<col;j++ ) 7 printf("%d ", pa[i][j] ); 8 printf("\n"); 9 } 10 } 11 void main() 12 { 13 int a[2][3]={ 14 {1,2,3}, 15 {4,5,6} 16 }; 17 int i; 18 int *pa[2]; 19 for( i=0;i<2;i++ ) 20 pa[i]=a[i]; 21 output(pa, 2, 3); 22 }
對於二維數組作為變量存在於函數中,有如下情況:
void Func(int array[3][10]); void Func(int array[][10]); void Func(int(*array)[10]);
如果要取p[i][j]的值,編譯器是這樣尋址的,它的地址為:
p + i*n + j;
void Func(int array[3][10]);
void Func(int array[][10]);
變為:
void Func(int **array, int m, int n);
在轉變後的函數中,array[i][j]這樣的式子是不對的(不信,大家可以試一下),因為編譯器不能正確的為它尋址,所以我們需要模仿編譯器的行為把array[i][j]這樣的式子手工轉變為:
*((int*)array + n*i + j);
在調用這樣的函數的時候,需要註意一下,如下面的例子:
int a[3][3] =
{
{1, 1, 1},
{2, 2, 2},
{3, 3, 3}
};
Func(a, 3, 3);
根據不同編譯器不同的設置,可能出現warning 或者error,可以進行強制轉換如下調用:
Func((int**)a, 3, 3);
指針、函數、二維數組之間的聯系