定義一個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的步長為它指向的指針的總范圍。
綜上,多維數組實際在值的背後,隱含著一個指針樹。或者稱為指針鏈也許更為准確。因為在某個地址未被指向時,那根針實際是不存在的,在一個時間點上,從上至下的指針取值路徑總是唯一的,所以呈鏈式。