做习题,是二维数组传递问题,我就像用指针来传递二维数组,一开始的代码如下:
void copy1(double ** a, double ** b, int i, int j)
{
int x, y;
for(x = 0; x < i; x++)
{
for(y = 0; y < j; y++)
{
*(*(b + x) + y) = *( *(a + x) + y);
}
}
}
put(double ** a, int i, int j)
{
int x, y;
for(x = 0; x < i; x++)
{
for(y = 0; y < j; y++)
printf("%.1f ", *(*(a + x) + y));
puts("");
}
puts("");
}
int main()
{
double source[2][5] = {1.1, 2.2, 3.3, 4.4, 5.5,
1.3, 2.8, 6.8, 7.6, 5.7};
double target2[2][5];
copy1(&source, &target2, 2, 5);
put(&source, 2, 5);
put(&target2, 2, 5);
return 0;
}
结果虽然没报错,但是警告有几个,运行也是理所当然的错误。
查了一下警告,是类型不匹配,二维数组和二级指针是不同的,需要强制转换什么的(不理解的第一点),
于是我就把
*(*(b + x) + y) = *( *(a + x) + y);
改为了 *((double *) (b + x) + y) = *((double *)(a + x) + y);
printf("%.1f ", *(*(a + x) + y));
改为printf("%.1f ", *((double *)(a + x) + y));
结果
第二个不理解的来了,一样的警告,但是为什么可以传递第一行的数据,可以打印第一行的数据,但是第二行就挂掉呢。
紧接着再改:
*(*(b + x) + y) = *( *(a + x) + y);
改为了 *((double *) b + i*x + y) = *((double *)a + i* x + y);
printf("%.1f ", *(*(a + x) + y));
改为printf("%.1f ", *((double *)a + i*x + y));
警告依旧,但是已经能传递和打印完整的数组了,类型不是不对么,为什么可以正常
void copy1(double ** a, double ** b, int i, int j)
{
int x, y;
for(x = 0; x < i; x++)
{
for(y = 0; y < j; y++)
{
*(*(b + x) + y) = *( *(a + x) + y);
}
}
}
put(double ** a, int i, int j)
{
int x, y;
for(x = 0; x < i; x++)
{
for(y = 0; y < j; y++)
printf("%.1f ", *(*(a + x) + y));
puts("");
}
puts("");
}
int main()
{
double source[2][5] = {1.1, 2.2, 3.3, 4.4, 5.5,
1.3, 2.8, 6.8, 7.6, 5.7};
double target2[2][5];
copy1(&source, &target2, 2, 5);
put(&source, 2, 5);
put(&target2, 2, 5);
return 0;
}
结果虽然没报错,但是警告有几个,运行也是理所当然的错误。
查了一下警告,是类型不匹配,二维数组和二级指针是不同的,需要强制转换什么的(不理解的第一点),
于是我就把
*(*(b + x) + y) = *( *(a + x) + y);
改为了 *((double *) (b + x) + y) = *((double *)(a + x) + y);
printf("%.1f ", *(*(a + x) + y));
改为printf("%.1f ", *((double *)(a + x) + y));
结果

第二个不理解的来了,一样的警告,但是为什么可以传递第一行的数据,可以打印第一行的数据,但是第二行就挂掉呢。
紧接着再改:
*(*(b + x) + y) = *( *(a + x) + y);
改为了 *((double *) b + i*x + y) = *((double *)a + i* x + y);
printf("%.1f ", *(*(a + x) + y));
改为printf("%.1f ", *((double *)a + i*x + y));
警告依旧,但是已经能传递和打印完整的数组了,类型不是不对么,为什么可以正常