目录
一.结构体类型的声明
1.结构是什么?
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
2.结构的声明
struct tag //struct:结构体关键字 tag:结构体标签 { member-list; //成员列表 }variable-list; //变量列表
3.typedef 类型重定义/重命名
typedef struct Stu { char name[20];//名字 int age;//年龄 char sex[8];//性别 float score; }Stu; int main() { //s4,s5是局部变量 //struct Stu 才是结构体类型,不能随便省略struct struct Stu s4; struct Stu s5; Stu s6; return 0; }
4.结构成员类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
5.结构体变量的定义和初始化
struct Point { int x; int y; }p1 = { 10, 15 };//直接初始化,注意:使用‘{}’ struct S { char c; struct Point sp; double d; char arr[20]; };//套用结构体 int main() { struct Point p = { 100, 200 };//在主函数中初始化 struct S ss = { 'w', {100,20}, 5.5, "hello" }; return 0; }
二.结构体成员访问
1.结构体变量访问成员
结构变量的成员是通过点操作符(.)的。操作符接受两个操作数2.结构成员访问操作符
. 结构体变量.结构体成员
-> 结构体指针->结构体成员{ int x; int y; }p1 = {10, 15};//直接初始化,注意:使用‘{}’ struct S { char c; struct Point sp; double d; char arr[20]; };//套用结构体 void print1(struct S s) { printf("%c\n", s.c); printf("%d %d\n", s.sp.x, s.sp.y); printf("%lf\n", s.d); printf("%s\n", s.arr); } void print2(struct S* ps) { printf("%c\n", ps->c); printf("%d %d\n", ps->sp.x, ps->sp.y);//一层一层向内,读到x,y一层 printf("%lf\n", ps->d); printf("%s\n", ps->arr); } int main() { struct Point p = {100, 200};//在主函数中初始化 struct S ss = { 'w', {100,20}, 5.5, "hello"}; //ss.c = 'b'; //ss.sp.x = 1000; //ss.sp.y= 2000; //ss.d = 3.14; //strcpy(ss.arr, "world");//strcpy字符串拷贝(引用string.h),严格遵循他应该进行的模式 print1(ss);//打印struct S类型的变量,直接把结构体传过去 print2(&ss);//传地址过去,对应的必须是指针 return 0; }
三.结构体传参
struct Point { int x; int y; }p1 = {10, 15};//直接初始化,注意:使用‘{}’ struct S { char c; struct Point sp; double d; char arr[20]; };//套用结构体 void print1(struct S s) { printf("%c\n", s.c); printf("%d %d\n", s.sp.x, s.sp.y); printf("%lf\n", s.d); printf("%s\n", s.arr); } void print2(struct S* ps) { printf("%c\n", ps->c); printf("%d %d\n", ps->sp.x, ps->sp.y);//一层一层向内,读到x,y一层 printf("%lf\n", ps->d); printf("%s\n", ps->arr); } int main() { struct Point p = {100, 200};//在主函数中初始化 struct S ss = { 'w', {100,20}, 5.5, "hello"}; print1(ss);//打印struct S类型的变量,直接把结构体传过去 print2(&ss);//传地址过去,对应的必须是指针 return 0; }
上面的 print1 和 print2 函数哪个好些?
1)答案是:首选print2函数。
2)原因:
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,每个元素都要重新建立新的一个,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
3)结论:
结构体传参的时候,要传结构体的地址