一、结构体类型的声明
下面声明两个结构体,一个为学生结构体student,一个为成绩单结构体transcript。transcript为student的成员之一。
struct称为“结构体关键字” ,student称为“结构体标签“,将二者合并struct student称为”结构体类型“,级别等同于int char等类型名
student里的name,age,grade叫做结构体的“成员”或“成员变量”
struct transcript {
short math;
short English;
short physics;
};
struct student {
char name[20];
short age;
struct transcript grade;
};
int main() {
return 0;
}
二、typedef重命名结构体
typedef为类型定义函数,可以把上述类型struct student 重命名为stu,以达到简化效果。
typedef struct transcript {
short math;
short English;
short physics;
}trs;
typedef struct student {
char name[20];
short age;
trs grade;
}stu;
int main() {
return 0;
}
三、结构体初始化
创建“结构体变量”s1,s2,进行初始化
int main() {
stu s1 = { "张三",20,{97,88,75} };
stu s2= { "李四",19,{92,73,67} };
return 0;
}
四、结构体成员访问
有两种访问方式
(1)直接用 . 来访问
int main() {
stu s1 = { "张三",20,{97,88,75} };
stu s2= { "李四",19,{92,73,67} };
printf("%s ", s1.name);
printf("%d ", s2.age);
printf("%d ", s1.grade.math);
return 0;
}
(2)通过创建结构体指针,用 -> 访问
int main() {
stu s1 = { "张三",20,{97,88,75} };
stu s2= { "李四",19,{92,73,67} };
stu* p_s1 = &s1;
stu* p_s2 = &s2;
printf("%s ", p_s1->name);
printf("%d ", p_s2->age);
printf("%d ", p_s1->grade.math);
return 0;
}
五、结构体传参即压栈简介
两种传参方式
(1)直接传整个结构体
void test(stu s1,stu s2) {};
int main() {
stu s1 = { "张三",20,{97,88,75} };
stu s2= { "李四",19,{92,73,67} };
test(s1, s2);
return 0;
}
(2)传递结构体指针
void test(stu* p_s1,stu* p_s2) {};
int main() {
stu s1 = { "张三",20,{97,88,75} };
stu s2= { "李四",19,{92,73,67} };
stu* p_s1 = &s1;
stu* p_s2 = &s2;
test(p_s1, p_s2);
return 0;
}
应优先选用指针传参
原因:函数传参时,参数在栈区进行压栈存储,直接传整个结构体,参数太多,存取时对系统开销较大,会导致性能下降。