29课的课后题的疑问
这个代码是29课的课后题,小甲鱼答案是9,但是在我的电脑上会报错:cannot convert 'int (*)' to 'int (*)'请问这是怎么回事?怎样修改?只能改成 void func(int b);么?
#include <stdio.h>
void func(int b[]);
void func(int b[])
{
printf("%d\n", b);
}
int main(void)
{
int a[] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
func(a);
return 0;
} 这个错误是由于函数声明和定义中的数组维度不匹配导致的。
在函数声明void func(int b[]);中,参数b被声明为一个二维数组,其中第一维的大小未指定,而第二维的大小为 3。
在函数定义void func(int b[])中,参数b被定义为一个二维数组,其中第一维的大小为 3,而第二维的大小为 3。
然而,在main函数中,数组a被声明为一个二维数组,其中第一维的大小为 3,而第二维的大小为 4。
因此,当你调用func(a);时,传递给函数的数组a的类型为int (*) ,而函数func期望的类型是int (*) ,两者不匹配,所以编译器报错。
为了解决这个问题,你可以修改函数声明和定义中的数组维度,使其与a数组的维度匹配。你可以将函数声明改为void func(int b[]); ,并将函数定义改为void func(int b[]) ,然后重新编译运行代码。
修改后的代码如下:
#include <stdio.h>
void func(int b[]);
void func(int b[])
{
printf("%d\n", b);
}
int main(void)
{
int a[] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
func(a);
return 0;
}
这样修改后,代码应该可以正确编译和运行,并输出11 。 isdkz 发表于 2023-11-9 20:29
这个错误是由于函数声明和定义中的数组维度不匹配导致的。
在函数声明void func(int b[]);中,参 ...
关键是课后题的答案为什么没说会报错,并且返回了9.就是已经自动做了转换,且不会报错。 不能改成b,这题想考你的就是当传入参数的列数不同的时候,b会是什么值。 即实参传给形参的时候,会变成形参的列数。
报错就是因为维度不匹配,至于为什么小甲鱼没有说会报错。我认为是因为小甲鱼课后非动动手的测试题,侧重考的自己读程序来理解,目的不同。
希望能给个最佳回答! 妖娆乌龙茶 发表于 2023-11-10 16:03
不能改成b,这题想考你的就是当传入参数的列数不同的时候,b会是什么值。 即实参传给形参的时 ...
可是小甲鱼的答案是9啊 hanghanga 发表于 2023-11-10 19:39
可是小甲鱼的答案是9啊
答案是9呀
123 4 形参是b[]所以变成了3列的 12 3 在这个数组里b,第3行的第3列不就是9了?
567 8 4 56
9 10 11 12 7 89
10 11 12 妖娆乌龙茶 发表于 2023-11-13 09:36
答案是9呀
123 4 形参是b[]所以变成了3列的 12 3 在这个数组里b
按照小甲鱼的答案的写法是报错,不是9啊 hanghanga 发表于 2023-11-13 22:42
按照小甲鱼的答案的写法是报错,不是9啊
就是会报错呀,报错就是因为维度不匹配,正常不能这样设置实参的
页:
[1]