----------------------结构体详解+剖析--------------------------------
结构体类型的声明
1.结构体的声明
1.1结构体的基础知识
结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2结构体的声明
>` struct sth(随便写,最好有意义) > { > member(成员)--list(列表) > }variable-list;(创建一个结构体变量) `
例如描述一个学生:
struct Stu { char name[10];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号 }Stu;//分号不能丢掉
1.3结构体成员的类型
结构体成员可以是标量,数组,指针,甚至是其他结构体。
1.4结构体变量的定义和初始化
有了结构体的类型,那如何定义变量呢?
struct Point { int x; int y;//声明结构成员变量类型 }p1;//同时又定义变量p1; struct Point p2//定义结构体变量p2 struct Point p3 = { x,y }; //初始化:定义变量的同时赋初始值。
结构体初始化
struct Stu// 结构体类型声明 { char name[15];//名字 int age;//年龄 }; struct Stu s = { "zhangsan",20 };//初始化
struct Point { int x; int y;//声明结构成员变量类型 }p1;//同时又定义变量p1; struct Node { int date; struct Point p; struct Node* next; }n1={10,{4,5},NULL}; //结构体嵌套初始化 struct Node n2 = { 20,{5,6},NULL };//结构体嵌套初始化。
结构体成员的访问
1.结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接收两个操作数。
例如:
我们可以看到结构体s有成员name和age;
那我们如何访问s的成员呢?
struct Stu// 结构体类型声明 { char name[15];//名字 int age;//年龄 }; struct Stu s = { "zhangsan",20 };//初始化 int main() { struct S s; strcpy(s.name, "zhangsan");//使用.访问name成员’ s.age = 20;//使用.访问age成员 return 0; }
2.结构体指针访问指向变量的成员
有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。
那该如何访问成员呢?
struct Stu { char name[10]; int age; }; void print(struct Stu* ps)//print函数接收结构体地址,定义为ps { printf("name=%s age=%d\n", (*ps).name, (*ps).age);//利用解引用操作符来访问指针 //使用结构体指针访问指向对象的成员 printf("name=%s age=%d\n", ps->name, ps->age);//->重点 } int main() { struct Stu s = { "zhangsan",20 }; print(&s);//结构体地址传参,把结构体s的地址传过去 return 0; }
->(变量地址)可以直接进行访问地址,.操作符还要解引用操作符才能访问地址
结构体传参
struct Stu { int id[1000];//构建结构体 int age; }; struct Stu s = { {220503430},20 };//结构体初始化 //结构体传参 void print1(struct Stu s) { printf("%d\n", s.age); } //结构体地址传参 void print2(struct Stu* ps) { printf("%d\n", (*ps).age); printf("%d\n", ps->age); } int main() { print1(s);//传结构体 print2(&s);//传结构体地址 return 0; }
print1和print2函数都能实现对结构体的访问,哪个更好一些呢?
答案是print2函数
因为函数在传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销就比较大,所以会导致性能的下降。
所以最后结论:
结构体在传参时,最好传结构体的地址!