指针和数据结构问题?(语言-c语言)

为社么用38行到41行之间的形式表示就会报错,即注释内容
 #include <stdio.h>
#include <stdlib.h>
typedef struct student
{
    int num;
    char name[20];
    char sex;
    int score;
 }Student;
 void check(Student *stu)
 {
     Student *p;
     printf("不及格的学生成绩为:\n");
     for(p=stu;p<stu+3;p++)
     {
         if(p->score<60)
         {
             printf("%d ",p->num);
             printf("%s ",p->name);
             printf("%c ",p->sex);
             printf("%d",p->score);
             printf("\n");
         }
     }
  } 
 int main()
 {
     Student *p;
     int i;
     p=(Student *)malloc(sizeof(Student)*2);
     printf("请输入学生信息和成绩");
     for(i=0;i<3;i++)
     {
         scanf("%d",&(p+i)->num);
         scanf("%s%*c",(p+i)->name);
         scanf("%c",&(p+i)->sex);
         scanf("%d",&(p+i)->score);
         //scanf("%d",&p[i]->num);
         //scanf("%s%*c",p[i]->name);
         //scanf("%c",&p[i]->sex);
         //scanf("%d",&p[i]->score);
     }
    check(p); 
     free(p);
 return 0;
  } 


因为p[i]是结构变量,它的类型是Student而非Student *,所以要使用 . 而不是使用 ->

1、首先,通过scanf扫描键盘输入来进行初始化,需要使用地址传递的方式,因此scanf函数的第二个参数,是我们想初始化的结构体中变量的地址,因此如果是数值类型,需要前边加上&符号,弄清楚这个,是为了防止&符号干扰分析
2、其次,要清楚,p是结构体的指针,作为地址,指向结构体,而p[0]则是p指向的那个结构体。由结构指针访问到结构体中的成员,需要使用->符号,而由结构体访问到结构体中的成员,需要使用.

p=(Student *)malloc(sizeof(Student)*2); 应修改为:p=(Student *)malloc(sizeof(Student)*3);
第38至41行修改为:
scanf("%d",&p[i].num); // scanf("%d",p[i]->num);
scanf("%s%*c",p[i].name);//scanf("%s%*c",p[i]->name);
scanf("%c",&p[i].sex); //scanf("%c",p[i]->sex);
scanf("%d",&p[i].score);//scanf("%d",p[i]->score);