C语言结构体

1. 结构体的基础与声明

1.1 基础知识

  • 定义: 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 。
  • 成员类型: 结构的成员可以是标量、数组、指针,甚至是其他结构体 。

1.2 声明语法

cpp 复制代码
struct tag
{
    member-list;
} variable-list;
//关键点: 结构体声明结束的花括号后面,分号不能丢 。

2. 变量的定义与初始化

2.1 变量的定义(两种方式)

定义结构体变量主要有两种方式 :

方式一:在声明类型的同时定义变量

cpp 复制代码
struct 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字节),开销极小且固定。

结论:结构体传参的时候,要传结构体的地址 。

相关推荐
霸道流氓气质2 分钟前
Mermaid 图表完全指南:从文本语法到LangGraph4j工作流可视化实战
开发语言·python
泡海椒16 分钟前
JQuick-Excel 项目定位与适用场景:声明式 Java Excel 的边界
java·开发语言·excel
slandarer32 分钟前
MATLAB | R2026b 更新了哪些有趣的新东西
开发语言·数据库·matlab
工具派42 分钟前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word
wjcroom1 小时前
实现老型号HP打印机手机无线打印的一些步骤和方法
开发语言·智能手机·php
潜龙95271 小时前
需求文档一键变测试用例:手工用例智能生成平台
开发语言·c#
sunburn-1 小时前
Java 排序算法详细教学:从冒泡排序到快速排序
java·开发语言·数据结构·ide·算法
鹤卿1231 小时前
「iOS」GCD
开发语言·ios·objective-c
我是小白呀1 小时前
编排还是事件协作?用 AcmeFlow 讲清企业 Workflow 的控制权
java·开发语言
ACP广源盛139246256731 小时前
接口适配方案选型|GSV6125@ACP HDMI2.0 转 Type‑C/DP1.4 桥接芯片工程评估
大数据·c语言·开发语言·硬件架构·硬件工程·国产芯片