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字节),开销极小且固定。

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

相关推荐
wuqingshun31415918 分钟前
重写equals而不重写hashCode,会出什么问题?
java·开发语言
飞猪~19 分钟前
LangChain python 版本 第一集
开发语言·python·langchain
李燚2 小时前
Go 项目怎么组织:DDD 4 层 vs MVC vs 脚本式
开发语言·golang·mvc·ddd·agent框架·eino
2zcode3 小时前
免费开源项目文档:基于MATLAB图像处理的啤酒瓶口缺陷检测系统设计与实现
开发语言·图像处理·matlab
人工智能时代 准备好了吗3 小时前
AI回答内容进入率监测:引用识别、文本匹配与语义判断
开发语言·人工智能·python
LONGZETECH3 小时前
新能源汽车动力电池检测仿真教学系统:C/S 分层架构与数字化实训落地全解析
大数据·c语言·开发语言·人工智能·架构·系统架构·汽车
郝学胜-神的一滴3 小时前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
Metaphor6924 小时前
使用 Python 冻结 Excel 文件中的行、列和单元格
开发语言·python·excel
言乐64 小时前
Python实现建造微服务商城后台
开发语言·python·算法·微服务·架构
KobeSacre4 小时前
Semaphore 源码
java·开发语言