#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);