为什么number [i] .grade被视为指针类型无法与int类型进行比较?

时间:2014-12-18 10:34:10

标签: c

#include<stdio.h>
#define N 2
struct student
{
    int stu_NO;
    char name[20];
    int grade[i];
};
int main(void)
{
struct student number[N];
int i,grade_count=0;
int excellent_sum=0,good_sum=0,middle_sum=0,pass_sum=0,fail_sum=0;
for(i=0;i<N;i++)
    scanf("%d %c %d",&number[i].stu_NO,&number[i].name,&number[i].grade);
for(i=0;i<N;i++)
{
    if(*number[i].grade>90)
       excellent_sum++;
    else if(*number[i].grade<=90||*number[i].grade>80)
           good_sum++;
    else if(*number[i].grade<=80||*number[i].grade>70)
           middle_sum++;
    else if(*number[i].grade<=70||*number[i].grade>=60)
           pass_sum++;
    else if(*number[i].grade<60)
          fail_sum++;
          grade_count+=*number[i].grade ;
}
printf("%d %d %d %d %d",excellent_sum,good_sum,middle_sum,pass_sum,fail_sum);
printf("%.2f %.3f %.4f %.5f %.6f",excellent_sum/N,good_sum/N,middle_sum/N,pass_sum/N,fail_sum/N);
printf("grade_count=%d",grade_count);
return 0;
}

我不太清楚指针和数组之间究竟有什么内在联系,这是我的第一个结构代码,希望你能帮我解决问题。我将在这里评分[i]评分,和*删除后,更改代码仍然存在一些我没有想到的错误,grade_count有一些奇怪的错误。最后一个printf有一个最后的%d。你能帮我解释一下这些小细节吗?

3 个答案:

答案 0 :(得分:1)

由于int grade[N]是一个数组,因此您可以使用*number[i].grade访问number[i].grade[N]的第一个元素

*number[i].gradenumber[i].grade[0]

相同

答案 1 :(得分:0)

 int grade[N];

grade是一个数组。因此,您可以使用*number[i].gradenumber[i].grade[0](相当于)来访问它。

number[i].gradeint上的指针。

答案 2 :(得分:0)

除非它是sizeof或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型的表达式 -element数组T“将被转换(”衰减“)到类型为”T指针“的表达式,表达式的值将是数组的第一个元素的地址

所以,在行

if (*number[i].grade > 90)

表达式number[i].grade的类型为“{-1}}的2元素数组”;由于表达式不是int或一元sizeof运算符的操作数,因此它“衰减”以键入“指向&的指针”,表达式的值是{的地址{1}}。

因此,表达式int相当于number[i].grade[0]。表达式被解析为*number[i].grade;数组下标运算符number[i].grade[0]和组件选择运算符*(number[i].grade)的优先级高于一元[]运算符。