定义一个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的步长为它指向的指针的总范围。
综上,多维数组实际在值的背后,隐含着一个指针树。或者称为指针链也许更为准确。因为在某个地址未被指向时,那根针实际是不存在的,在一个时间点上,从上至下的指针取值路径总是唯一的,所以呈链式。
时间: 2024-10-01 07:07:56