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

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

相关推荐
天远云服10 小时前
Go语言高并发实战:集成天远手机号码归属地核验API打造高性能风控中台
大数据·开发语言·后端·golang
范纹杉想快点毕业10 小时前
嵌入式通信核心架构:从状态机、环形队列到多协议融合
linux·运维·c语言·算法·设计模式
网安_秋刀鱼10 小时前
【java安全】反序列化 - CC1链
java·c语言·安全
2501_9418771310 小时前
在法兰克福企业级场景中落地零信任安全架构的系统设计与工程实践分享
开发语言·php
leiming610 小时前
c++ QT 开发第二天,用ui按钮点亮实体led
开发语言·qt·ui
2501_9418824810 小时前
在开普敦跨区域部署环境中构建高可靠分布式配置中心的设计思路与实现实践
开发语言·c#
一只小小Java10 小时前
Java面试场景高频题
java·开发语言·面试
Ljubim.te10 小时前
inline介绍,宏定义的注意事项以及nullptr
c语言·开发语言·c++
亓才孓10 小时前
多态:编译时看左边,运行时看右边
java·开发语言
小白探索世界欧耶!~10 小时前
用iframe实现单个系统页面在多个系统中复用
开发语言·前端·javascript·vue.js·经验分享·笔记·iframe