C语言-结构

结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量

访问结构体成员变量的时候用点.来调用

struct Stu{//struct Stu是一个结构类型,类似于int char name[20]; int age; char tele[20]; char sex[20]; }; int main(){ struct Stu s={"张三",20,"16273847436","男"};//就相当于int a; printf("%s,%d,%s,%s\n",s.name,s.age,s.tele,s.sex); //打印出,张三,20,16273847436,男 return 0; }

嵌套结构如下

struct birthy{ int year; int month; int day; }; struct Stu{ char name[20]; int age; char tele[20]; char sex[20]; struct birthy b; }; int main(){ struct Stu s={"张三",20,"16273847436","男",{2002,12,12}};//这里的s叫做局部变量 printf("%s,%d,%s,%s,%d年%d月%d日\n", s.name,s.age,s.tele,s.sex,s.b.year,s.b.month,s.b.day); //打印出,张三,20,16273847436,男,2002年12月12日 return 0; }

结构的重命名

不重命名的话每次创建变量时候都要struct Stu s1,struct Stu s2
重命名的话创建变量的时候就不用加struct,直接Stus s1,Stus s2

//对类型进行重命名,把Stu改成Stus typedef struct Stu{ …… }Stus; struct Stu{ …… }s1,s2,s3;//声明类型的同时定义变量s1,s2,s3 //这里的s1,s2,s3叫全局变量

如果要封装一个打印结构体的函数的话,选print2好一点,因为函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过于大,参数压栈的系统开销较大,所以会导致性能下降,总之,结构体传参的时候,要传结构体的地址好一点

struct Stu{ char name[20]; int age; char tele[20]; char sex[20]; }; void print1(struct Stu temp){ printf("%s %d %s %s\n",temp.name,temp.age,temp.tele,temp.sex); } void print2(struct Stu *temp){ printf("%s %d %s %s\n",(*temp).name,(*temp).age,(*temp).tele,(*temp).sex); //上边这一行就等于这一行printf("%s %d %s %s\n",temp->name, temp->age, temp->tele, temp->sex); } int main(){ struct Stu s={"张三",20,"16273847436","男"}; print1(s);//传结构体 print2(&s);//传地址 return 0; }

匿名结构体

struct {
char name[20];
int age;
char tele[20];
char sex[20];
}s;
这个叫匿名结构体变量,声明匿名结构体的时候必须在后边紧跟着创建结构体变量,例如s

结构体的内存对齐

struct S1{ char c1; int a; char c2; }; struct S2{ char c1; char c2; int a; }; int main(){ struct S1 s1={0}; struct S2 s2={0}; printf("%d\n",sizeof(s1));//12 printf("%d\n",sizeof(s2));//8 return 0; }