结构体初阶
结构体类型的声明
结构体初始化
结构体成员访问
结构体传参
- 结构体的声明
1.1 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2 结构的声明
例如描述一个学生
struct tag
{
member - list;//成员链表
}variable - list;//变量链表
struct student
{
char name[20];//名字
int age;//年龄
char sex[8];//性别
float score;
}s1,s2,s3;//s1,s2,s3是通过struct student 类型创建的变量,这样就一次性创建了三个变量
//这里可写可不写,此时的s1,s2,s3,就是全局变量
int main()
{
//s3,s4是局部变量
struct student s4;
struct student s5;
return 0;
}
C语言默认struct不能省略,有了struct才是结构体类型
那么怎么才能省略struct呢?
这里就用到了typedef 类型重定义
这里我们使用CTRL+F7进行测试发现没有问题
或者还有以下的形式。
对整个结构体进行重定义,这里就不能使用定义s1,s2,s3了。
-
- 结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
-
- 结构体变量的定义和初始化
有了结构体类型,那如何定义变量,其实很简单
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
结构体赋值跟数组一样有多个变量,想要给结构体赋值,就可以模仿数组{}使用中括号
这就是结构体的初始化
这是较为复杂的结构体赋值
- 结构体成员的访问
结构成员访问操作符
. 结构体变量,结构体成员
->结构题指针
两种方式去访问结构体的操作符
函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的 下降。
结论: 结构体传参的时候,要传结构体的地址。
提到压栈,就不得不提到内存上的三个区域
栈区:局部变量,函数参数
堆区:动态内存开辟,malloc,free calloc
静态区:静态变量,全局变量
传值调用,每一次函数的调用都要在内存的栈区上开辟一块空间,都是对参数的拷贝,占用内存空间会很大
传址调用:每一次的调用只是存放地址,通过地址来操作,地址至多就占4-8个字节