结构体与共用体,枚举
1.数据类型复习:
2结构体.
eg;统计全校同学信息 需要记录的点--- 姓名,班级,性别,成绩,年龄
统计名字:char s[ ] [ 100 ] = { "Tmo" }
统计班级:int ; 统计性别: char ; 统计成绩 : float ; 统计年龄: int
一个人的相关信息要用到5个数组,想有一种数据可以描述一个人的相关信息,就可以用结构体:
结构体:struct
描述一些原先基本数据类型不好描述的,复杂的数据类型
语法:struct + 结构体类型名
{
}; //定义了一个“数据类型” -- 用户自定义的数据类型
eg:描述学生的个人信息----
struct student
{
char name[20]; //放名字
unsigned char age; //放年龄
等 - - -
};
于是乎: struct student s ------ 学生这种数据类型(等价于基本类型的种类),定义了一个s变量 按照给的类型顺序来用 struct student s = {"Tom",20,59.5,110} --- 名字,年纪,成绩,
注意:1.结构体 - 用来实现自定义的数据类型
2.用结构体 : 先构造数据类型,用数据类型定义i变量,数组,指针等
访问结构体: . //结构体成员运算符
打印输出: printf("%d", s . 定义的数据类型中的名字(如 name,aage))
eg;printf(”%d“,s.name)
-> : 指向结构体成员
3.结构体的对齐规则:
1.在32位的平台上,默认都是按4字节对齐的。
2.对于成员变量,各自在自己的自然边界上对齐。
3.如果 成员变量中有比4字节大。此时整个结构体按照4字节对齐。(64位默认为8字节)
4.如果成员变量中没有有比4字节大。
此时整个结构体按照最大的那个成员对齐。
相关程序实现
1.编写一个“老师”的结构体,写出一个输入、输出的函数,打印出来
struct teacher
{char name[20];int tno;float salary;
};void printfteacher(struct teacher *t)
{printf("name = %s\n",t-> name);printf("tno = %d\n",t-> tno);printf("salary = %2.f\n",t-> salary);}void inputteacher(struct teacher *t)
{printf("name :");scanf("%s",t->name);printf("tno :");scanf("%d",&t->tno);printf("salary :");scanf("%f",&t->salary);
}int main(void)
{struct teacher t={0};inputteacher(&t);printfteacher(&t);}
2.编写一个学生的结构体,编写输入输出函数,找到最大成绩的学生打印信息,以学生成绩做一个排序
struct student
{char name[20];int sno;float score;
};void printfstudent(struct student *t,int len)
{int i;printf("name\tsno\tscore\t\n");for(i=0;i<len;i++){printf("%s\t",(t+i)->name);printf("%d\t",(t+i)->sno);printf("%.2f\t\n",(t+i)->score);}
}void inputstudent(struct student *t,int len)
{int i;for(i=0;i<len;i++){printf("name :");scanf("%s",(t+i)->name);printf("sno :");scanf("%d",&(t+i)->sno);printf("score :");scanf("%f",&(t+i)->score);}}
void maxstudent(struct student *t,int len)
{int i=0;float max=t->score;int j=0;for(i=0;i<len;i++){if(max<(t+i)->score){max=(t+i)->score;j=i;}}printf("max = %s %d %.2f\n",(t+j)->name,(t+j)->sno,(t+j)->score);
}int compare(const void *a,const void *b)
{const struct student *p1=a;const struct student *p2=b;return p1->score - p2->score;
}int main(void)
{struct student s[3]={0};inputstudent(s,3);maxstudent(s,3);qsort(s,3,sizeof(struct student),compare);printfstudent(s,3);return 0;
}