1. 程式人生 > >指針、函數、二維數組之間的聯系

指針、函數、二維數組之間的聯系

尋址 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);

指針、函數、二維數組之間的聯系