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

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

相关推荐
LDR0062 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术2 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园2 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob2 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享2 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.2 天前
C语言--day30
c语言·开发语言
玖玥拾2 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
何以解忧,唯有..2 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽2 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下2 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php