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));
}
展开
 我来答
plmday
2014-02-14 · TA获得超过474个赞
知道小有建树答主
回答量:143
采纳率:0%
帮助的人:240万
展开全部

你的错误主要出在二维数组参数声明和数组访问出界上。下面是修改后的代码:


#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)。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式