C语言报expected declaration specifiers before '*' token错误
C语言数组指针传参触发
expected declaration specifiers or ‘...’ before ‘*’ token错误修复 错误根因
直接触发该编译错误的原因是指针声明语法书写错误:函数声明、定义的形参中写了*int grades[],C语言中指针修饰符*必须跟在类型关键字之后、形参名之前,不存在*int这种合法类型写法,编译器读到*时找不到前置的合法类型声明,就会抛出该错误。
除此之外代码中还有多处逻辑、语法问题,全部问题点如下:
- 头文件引入顺序错误:
#include <stdio.h>需要放在所有函数声明、代码逻辑之前,否则会触发printf隐式声明告警。 - 形参类型和实参不匹配:传入的
grades是一维int数组,形参不需要多级指针,正确的形参写法为int grades[](数组传参会自动退化为首元素指针,等价于int *grades)。 - 整数除法精度丢失:
sum和howmany都是int类型,直接运算会执行整数除法截断小数,即使返回double类型也拿不到正确的浮点结果,运算前需要先把其中一个值转为double类型。 - 返回值接收、格式化输出类型不匹配:函数返回值是double类型,不能用int类型变量接收,也不能用
%d占位符输出,需要用double类型存储、%f占位符输出。
修正后可运行代码
#include <stdio.h> double findaverage(int howmany, int grades[]); double findaverage(int howmany, int grades[]) { int i; int sum = 0; for (i = 0; i < howmany; i++) { sum = grades[i] + sum; } // 强转sum为double做浮点除法,避免整数截断 return (double)sum / howmany; } int main() { const int size = 5; int grades[5] = {30,56,23,44,45}; // 用double类型接收平均值,用匹配的格式符输出 double average = findaverage(size, grades); printf("%.2f", average); return 0; }
运行后输出结果为39.60,和手动计算的平均值一致。
内容的提问来源于stack exchange,提问作者RhoAies
相关产品推荐
相关产品推荐

