C语言--结构体

什么是结构体

结构体可以理解为自定义的数据类型。他是由一批数据组合而成的结构型数据,里面的每一个数据都是结构体的"成员"

结构体的定义格式

c 复制代码
struct 结构体名 {
    数据类型 成员1;
    数据类型 成员2;
    // 更多成员...
};
 

示例:定义一个学生的信息

c 复制代码
struct Student {
    char name[50];
    int age;
    float score;
};
 

完整流程(定义+赋值+访问)

起别名

定义结构体同时起别名

c 复制代码
typedef struct {
    char name[20];
    int age;
} Student; // 直接定义结构体并起别名
 

使用别名声明变量

定义别名后,可以直接使用别名声明变量,无需再写struct关键字

c 复制代码
Student s1; // 等价于 struct Student s1
 

结构体数组

结构体数组的定义

在C语言中,结构体数组是由相同结构体类型的元素组成的数组。定义时需要先声明结构体类型,再声明该类型的数组。例如:

c 复制代码
struct Student {
    char name[50];
    int age;
    float score;
};

struct Student class[30]; // 定义包含30个Student结构体的数组

结构体数组的访问

通过数组下标访问成员,使用点运算符.访问具体字段:

c 复制代码
class[0].age = 18;          // 修改第一个学生的年龄
strcpy(class[1].name, "Alice"); // 为第二个学生赋值姓名
printf("%f", class[2].score);   // 输出第三个学生的分数

完整流程

函数结构体作为参数传参(指针)

传递结构体指针可避免拷贝开销,函数内修改会影响原结构体:

示例:修改一名学生的信息

结构体嵌套

结构体嵌套的基本概念

在C语言中,结构体可以嵌套使用,即一个结构体的成员可以是另一个结构体类型。这种设计适用于需要表示复杂数据关系的场景,例如学生信息中包含出生日期(另一个结构体)。

嵌套结构体的定义方式

直接嵌套定义:在外部结构体内部直接定义内部结构体。

c 复制代码
struct Date {
    int year;
    int month;
    int day;
};

struct Student {
    char name[50];
    struct Date birthday; // 嵌套Date结构体
    int score;
};

完整流程

结构体内存对齐

确定变量位置:只能放在自己类型整数倍的内存地址上

最后一个补位:结构体的总大小,是最大类型的整数倍

重要!!!

内存对齐:

不管是结构体,还是普通的变量都存在内存对齐

规则:

只能放在自己类型整数倍的内存地址上

简单理解:

内存地址 /占用字节 =结果可以整除

举例:

int存放的位置:内存地址一定能被4整除

long long存放的位置:内存地址一定能被8整除,double存放的位置:内存地址一定能被8整除

结构体的内存对齐:结构体在上面的基础上又多了一条,结构体的总大小,是最大类型的整数倍(用来确定最后一个数据补位的情况)

切记!

对齐的时候会补空白字节,但是不会改变原本字节的大小char补位之后,本身还是1个字节

心得:

我们会把小的数据类型,写在最上面,大的数据类型,写在最下面(节约空间)

代码验证

相关推荐
you-_ling4 小时前
IO编程相关知识
c语言·vscode
小龙报4 小时前
【51单片机】深度解析 51 串口 UART:原理、配置、收发实现与工程化应用全总结
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·51单片机
承渊政道4 小时前
C++学习之旅【C++中模板进阶内容介绍】
c语言·c++·笔记·学习·visual studio
qq_532453534 小时前
使用 Three.js 构建沉浸式全景图AR
开发语言·javascript·ar
浅念-5 小时前
C语言——动态内存管理
c语言·开发语言·c++·笔记·学习
草履虫建模11 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq13 小时前
分布式系统安全通信
开发语言·c++·算法
学嵌入式的小杨同学13 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
Re.不晚13 小时前
Java入门17——异常
java·开发语言
精彩极了吧14 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合