C语言 - 结构体声明、定义、初始化、结构体成员访问、结构体传参
- 一 结构体类型的声明:
- 声明格式:
- 二 结构体的定义并初始化
- 2.1用结构体创建(定义)结构体变量(对象)的两种方式:
- (1)全局结构体变量的定义
- (2)局部结构体变量的定义
- 结构体的成员变量可以是:
- 2.2结构体的初始化:
- (1)定义方式一(全局结构体变量)中,定义并且初始化:
- (2)定义方式二(局部结构体变量)中,定义后并初始化:
- 三 结构体成员访问:(定义并初始化后的使用)
- 3.1 .操作符的使用:
- 3.2 ->操作符的使用:
- 四 结构体传参:
- 4.1函数调用对结构体变量内容进行传值/传址打印:
- (1)print1传递结构体变量(传值调用)
- (2)print2传递结构体变量的地址(传址调用)
- 4.2传值和传址的优缺点:
- 栈:
- 压栈出栈例子:
一 结构体类型的声明:
类比数组:
数组:一组相同类型的元素的集合
结构体:一些值(成员变量)的集合,但是值的类型可以不同(char,short int float,double…)的变量
描述复杂对象(比如学生):
struct Stu称之为结构体类型
用类型创建对象(对照int类型创建变量):struct Stu s;--------------->s称为对象
用类型创建一个对象(由图纸盖出房子)
声明格式:
struct 结构体名字
{
成员变量列表;
};
二 结构体的定义并初始化
2.1用结构体创建(定义)结构体变量(对象)的两种方式:
(1)全局结构体变量的定义
struct 结构体名字
{
结构体成员列表;
}结构体变量(对象)列表;
这里的对象(结构体变量)为全局变量
(2)局部结构体变量的定义
struct 结构体名字
{
结构体成员列表;
};
struct 结构体名字 对象名字;
这里的结构体成员变量(对象)为局部变量
结构体的成员变量可以是:
(1)标量(2)数组 (3)指针
(4)甚至其他结构体:
2.2结构体的初始化:
(1)定义方式一(全局结构体变量)中,定义并且初始化:
(2)定义方式二(局部结构体变量)中,定义后并初始化:
三 结构体成员访问:(定义并初始化后的使用)
两个结构体成员访问操作符:.和->
3.1 .操作符的使用:
(1)
(2)
3.2 ->操作符的使用:
&s:对结构体变量s取地址
存放到结构体指针当中去:
struct Stu* ps=&s;
ps是结构体指针的名字,struct Stu*说明ps指向的是结构体类型变量(ps是结构体类型指针):
等价于:
因为ps为指针,可以使用->访问操作符
四 结构体传参:
4.1函数调用对结构体变量内容进行传值/传址打印:
(1)print1传递结构体变量(传值调用)
(2)print2传递结构体变量的地址(传址调用)
4.2传值和传址的优缺点:
方式一传值: 传递来的数据需要在内存中开辟一块相同大小的空间用于存放数据,浪费空间(压栈过高),优点是不可修改,安全性高。
方式二传址:传来的是仅仅是结构体变量的地址(8个字节的一串十六进制数字),节省空间,效率更高;另外, 传址调用,可以改变结构体变量中的值。
因此,传参时候参数为结构体时候,首选方式二传参时传址
栈:
栈的概念:
栈,是一种数据结构:先进的后出,后进的先出
-
压栈(从顶放):函数传参需要压栈,
-
出栈:(从顶出):
内存分区:
堆区,栈区,静态区
任一函数的使用,都会在内存的栈区上开辟一块空间,函数结束时候,这块空间会自动释放。
压栈出栈例子:
该调用函数在栈区中的动态过程: