1. 结构体的基础与声明
1.1 基础知识
- 定义: 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 。
- 成员类型: 结构的成员可以是标量、数组、指针,甚至是其他结构体 。
1.2 声明语法
cpp
struct tag
{
member-list;
} variable-list;
//关键点: 结构体声明结束的花括号后面,分号不能丢 。
2. 变量的定义与初始化
2.1 变量的定义(两种方式)
定义结构体变量主要有两种方式 :
方式一:在声明类型的同时定义变量
cppstruct Point { int x; int y; } p1;// 声明类型的同时定义变量p1
方式二:声明类型后,单独定义变量
cpp
struct Point p2; // 单独定义结构体变量p2
2.2 变量的初始化
初始化即在定义变量的同时赋初值 。
- 普通初始化:
struct Point p = {10, 20};
cpp
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zhangsan", 20};
- 指定成员:
struct Stu s = {"zhangsan", 20};
2.3 嵌套初始化
如果结构体中包含另一个结构体,使用嵌套的大括号进行初始化 。
cpp
struct Point { int x; int y; };
struct Node {
int data;
struct Point p;
struct Node* next;
};
struct Node n1 = {10, {4, 5}, NULL};
3. 结构体成员的访问
访问成员主要依据你手里拿的是"变量"还是"指针"。
- 情况 A:持有结构体变量
使用 点操作符 (.)
语法:变量名.成员名 - 情况 B:持有结构体指针
使用 箭头操作符 (->)
语法:指针变量->成员名
4. 结构体传参
在函数传参时,可以选择传值(复制整个结构体)或传址(传递指针)。
- 传值:
void print(struct S s); - 传址:
void print(struct S* ps);
为什么在处理较大的结构体时,必须首选"传址"而不是"传值"?
核心原因:系统开销(性能)。
函数传参时,参数是需要压栈的。
- 如果使用传值:当结构体过大时,系统需要开辟大量内存来复制数据,压栈开销大,导致性能下降 。
- 如果使用传址:无论结构体多大,只需要传递一个指针的大小(4或8字节),开销极小且固定。
结论:结构体传参的时候,要传结构体的地址 。