定義一個double型二維數組A和另一個同等尺寸的double空二維數組B,編寫一個函數將A中的數據復制到B中。並測試該程序。
1 #include <stdio.h> 2 void copy_ptr(const double (*s)[12],double (*tar)[12],int row,int col); 3 int main(void){ 4 const double rain[5][12]={ 5 {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6}, 6 {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3}, 7 {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4}, 8 {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2}, 9 {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2} 10 },t1[5][12]; 11 copy_ptr(rain,t1,5,12); 12 //printf("%.2f",t1[3][8]); 13 return 0; 14 } 15 void copy_ptr(const double (*s)[12],double (*tar)[12],int row,int col){ 16 int i,j; 17 for(i=0;i<row;i++){ 18 for(j=0;j<col;j++){ 19 *(*(tar+i)+j)=*(*(s+i)+j); 20 } 21 } 22 }
函數原型與函數定義中二維數組參數的寫法為
double (*s)[12]
這表示函數接受一個指針參數,該指針指向(具有12個double值的數組)。即子數組。
因為子數組本身又是指向每個單個double值的指針,所以此處double (*s)[12]的意義為 “s是一個指針,它指向(步長為1個double,范圍為0~11的指針)”,而s的步長為它指向的指針的總范圍。
綜上,多維數組實際在值的背後,隱含著一個指針樹。或者稱為指針鏈也許更為准確。因為在某個地址未被指向時,那根針實際是不存在的,在一個時間點上,從上至下的指針取值路徑總是唯一的,所以呈鏈式。