error C2100: illegal indirection
#include<stdio.h>voidmain(){floataver(float*a);voidnonstu(float*a,intt);floata[3][4];...
#include<stdio.h>
void main()
{
float aver(float *a);
void nonstu(float *a,int t);
float a[3][4];
int i,p,t;
for(i=0;i<3;i++)
for(p=0;p<3;p++)
scanf("%f",&a[i][p]);
scanf("%d",&t);
nonstu(a,t);
printf("%f",aver(a));
}
float aver(float *a)
{
int i,p;
float t=0;
for(i=0;i<3;i++)
for(p=0;p<3;p++)
t=t+*(*(a+i)+p);
t=t/12;
return t;
}
void nonstu(float *a,int t)
{
printf("%f\n%f\n%f\n%f\n",*(*(a+t)+1),*(*(a+t)+2),*(*(a+t)+3),*(*(a+t)+4));
} 展开
void main()
{
float aver(float *a);
void nonstu(float *a,int t);
float a[3][4];
int i,p,t;
for(i=0;i<3;i++)
for(p=0;p<3;p++)
scanf("%f",&a[i][p]);
scanf("%d",&t);
nonstu(a,t);
printf("%f",aver(a));
}
float aver(float *a)
{
int i,p;
float t=0;
for(i=0;i<3;i++)
for(p=0;p<3;p++)
t=t+*(*(a+i)+p);
t=t/12;
return t;
}
void nonstu(float *a,int t)
{
printf("%f\n%f\n%f\n%f\n",*(*(a+t)+1),*(*(a+t)+2),*(*(a+t)+3),*(*(a+t)+4));
} 展开
展开全部
你的错误主要出在二维数组参数声明和数组访问出界上。下面是修改后的代码:
#include <stdio.h>
float aver(float (*a)[4]); // 二维数组参数声明
void nonstu(float a[][4],int t); // 等价声明
int main(void) {
float a[3][4];
int i, p, t;
printf("Enter floats:\n"); // 提示输入
for(i = 0; i < 3; i++)
for(p = 0; p < 4; p++) // 一维子数组的下标的上界是4
scanf("%f", &a[i][p]);
printf("Enter index:\n"); // 提示输入
scanf("%d", &t);
nonstu(a, t);
printf("%f", aver(a));
return 0;
}
float aver(float (*a)[4]) {
int i, p;
float t = 0;
for(i = 0; i < 3; i++)
for(p = 0; p < 4; p++) // 条件控制设为p < 4使下标p得以便历有效值0~3
t = t + *(*(a+i)+p);
t = t / 12;
return t;
}
void nonstu(float (*a)[4], int t) {
// 下标有效范围为0~3,4出界
printf("%f\n%f\n%f\n%f\n", *(*(a+t)+0), *(*(a+t)+1), *(*(a+t)+2), *(*(a+t)+3));
}
追问
好的,谢谢您,但是能详细说一下(*a)[4]和a[][4]分别有什么意义吗?没有看懂,还有为什么要这样做参数声明?为什么不能直接给地址a呢?a不应该就是这个数组开头处的地址吗?
追答
(*a)[4]与a[][4]意思一样,都声明了一个指向大小为4的一维数组的指针a。因为你在main函数里面声明了一个二维数组a。原因可以作如下类推。
如果你声明了一个一维数组float a[4]。a的值为地址&a[0],a[0]是一个浮点数。如果你要写一个处理该一维数组的函数foo,你的函数声明应该为void foo(float a[])或者void float(float *a),这样你才能直接把该一维数组a传给foo,即foo(a)。
现在你在main函数里面声明了一个二维数组float a[3][4]。a的值为地址&a[0],a[0]是一个大小为4的一维数组(注意与上面一维数组a[0]的区别)。如果你要写一个处理该二维数组的函数foo,你的函数声明应该相应地改为void foo(float a[][4])或者foo(float (*a)[4])。这样,你才能直接把二维数组a传给foo,即foo(a)。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询