前言
结构体是c语言中的一个特别重要的知识点,本篇是对结构体的一个大体介绍,重点讲解结构体的主体框架,希望看完本篇能够让各位对结构体有一个基本的认识!
1. 浅谈结构体
前面我们已经学过了使用char、int、double……描述简单对象,但是当我们面对像书、人这样的复杂类型的对象时我们又该用什么描述呢?答案是:结构体。
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
结构是一些值的集合,这些值称为成员变量。不同于数组,结构的每个成员可以是不同类型的变量。结构的成员可以是标量、数组、指针,甚至是其他结构体。
2. 结构体类型的声明
📝例如:用结构定义一个学生类型Stu
//学生 //名字+年龄+性别+身高 struct Stu { char name[20];//名字 int age;//年龄 char sex[5];//性别 int hight;//身高 }s1,s2,s3;//全局变量 struct Stu s4;//全局变量 int main() { struct Stu s5;//局部变量 //通常情况下定义局部变量 return 0; }
3. 结构体初始化和成员访问
(1) 普通结构体类型的初始化和成员访问
📝实例展示:
//坐标类型 struct Point { int x; int y; }; //学生类型 struct Stu { char name[20];//名字 int age;//年龄 char sex[5];//性别 int hight;//身高 }; int main() { //结构体初始化 struct Point p = { 10,20 }; struct Stu s = { "张三",20,"男",180 }; //结构体成员访问 点操作符 printf("x = % d y = % d\n", p.x, p.y); printf("%s %d %s %d\n", s.name, s.age, s.sex, s.hight); //结构体成员访问 ->操作符 struct Point* ps = &p; struct Stu* pt = &s; printf("x = % d y = % d\n", ps->x, ps->y); printf("%s %d %s %d\n", pt->name, pt->age, pt->sex, pt->hight); return 0; }
注意:访问结构体成员有两种方式。结构体变量.结构体成员名;结构体指针->结构体成员名
(2) 复杂结构体类型的初始化和成员访问
📝实例展示:
struct Point { int x; int y; }; struct S { char c; struct Point p; double d; char str[]; }; int main() { //结构体初始化 //struct S ss = {.d=3.14, .c = 'x', .p.x =100};//乱序初始化某些成员// struct S ss = { 'x',{100,200},3.14,"哈哈"}; //结构体成员访问 点操作符 printf("%c %d %d %lf %s\n",ss.c,ss.p.x,ss.p.y,ss.d,ss.str); return 0; }
注意:结构体的初始化通常在创建结构体变量时进行,并且支持乱序初始化某些成员。
4. 结构体成员变量修改
📝实例展示:
struct S { int data[1000]; char buf[100]; }; void print1(struct S ss)//参数是结构体类型 { int i = 0; for (i = 0; i < 10; i++)//打印前十个元素 { printf("%d ", ss.data[i]); } printf("%s\n", ss.buf); } int main() { struct S s = { {1,2,3} , "hehe"}; print1(s);//传值调用 return 0; }
(2) 传址调用(函数参数为结构体指针)
📝实例展示:
struct S { int data[1000]; char buf[100]; }; void print2(struct S* ps)//参数是结构体指针类型 { int i = 0; for (i = 0; i < 10; i++) { printf("%d ", ps->data[i]); } printf("%s\n", ps->buf); } int main() { struct S s = { {1,2,3} , "hehe"}; print2(&s);//传址调用 return 0; }
结论:
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。如果传递结构体地址,地址占用内存很小,时间空间都会节省,程序效率会更高。因此结构体传参的时候,要传结构体的地址。
总结
本章篇幅不长,但是对于入门结构体也是特别重要。希望看完本篇能够给各位小伙伴们带来帮助,老铁们保持coding,我们下期再见!