C语言问题.一个二维数组a[3][4]存的是三位学生的四门成绩,现在要求把不及格的学生输出来。

#include<stdio.h>
#define pr printf
void main()
{int a[3][4]={{65,57,70,60},{80,47,90,81},{90,99,100,98}};
int bjg(int *p,int n);
bjg(a);
}
int bjg(int *p)
{int j,i;
for(j=0;j<3;j++)
for(i=0;i<4;i++)
{if((*(*(p+j)+i))<60)
{for(i=0;i<4;i++)
pr("NO%dfail,his score:\n%d ",j+1,*(*(p+j)+i));
}}
}
这是我写的程序,但是编译不能过,请问问题出在哪?有一门或以上的学生,他的四门都要输出。

#include<stdio.h>
#define pr printf
void main()
{
int a[3][4]={{65,57,70,60},{80,47,90,81},{90,99,100,98}};
int bjg(int *p);//后面的int n部分不要
bjg((int*)a);//加int*的强制转换
}
int bjg(int *p)
{
int j,i;
for(j=0;j<3;j++)
for(i=0;i<4;i++)
{
if((*((p+j*4)+i))<60)//改为*((p+j*4)+i)
{
for(i=0;i<4;i++)
pr("NO %d fail,his score:%d\n ",j+1,*((p+j*4)+i));//改为*((p+j*4)+i),%d放在\n前面
}
}

return 0;//加个返回值
}

追问

高手,我还有问题:
一.为什么要强制转换,我刚试了一下,不强制转换也能行啊。
二.为什么加return 0;不用加也能正常运行。
三.刚我把int bjg(int *p);改成int bjg(int (*p)[4])也能正常运行了,那是说(*P)[4]这个指针,如果P+1,他就能跳到下一行的首位置,跨度为4。而如果是*P,P+1他只能跳到a[0][1]跨度为1,我理解对吗?

追答

前面两点,编译器不同对代码要求不同,有的编译器不加也可以。把int bjg(int *p);改成int bjg(int (*p)[4])当然也是一种方法,因为a[3][4]是二维数组,你要当一维数组用,就要用我的改法,要当二维数组用就用你的这种int bjg(int (*p)[4])

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-01
#include<stdio.h>
#define pr printf
int main()
{int a[3][4]={{65,57,70,60},{80,47,90,81 },{90,99,100,98}};
int bjg(int p[3][4]);
bjg(a);
return 0;
}
int bjg(int p[3][4])
{int j,i; for(j=0;j<3;j++)
for(i=0;i<4;i++)
{if((*(*(p+j)+i))<60)
{for(i=0;i<4;i++)
pr("NO %d fail,his score:%d \n",j+1,*(*( p+j)+i)); }} }
相似回答