结构体与共用体,枚举
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;
}