C语言:入门到精通(408考研版)系列七 派生的数据类型

在C语言中,除了基本类型,我们还能基于它们构造出更复杂的数据形态,这被称为**派生数据类型。**408考试的核心就三类:数组、结构体、指针。

注:联合体(共用体)在考纲中常与结构体对比考察,枚举则涉及较少,这里一并讲解以形成完整体系。

一、数组(Array)

本质:一组相同类型元素的集合,在内存中连续存放。

1.定义与初始化

复制代码
int a[5];                 // 未初始化,值为随机
int b[5] = {1, 2, 3};     // 部分初始化,剩余补0:{1,2,3,0,0}
int c[] = {1, 2, 3};      // 长度自动为3
char str[] = "hello";     // 字符串,长度为6(含'\0')

2.一维与二维数组(重点:地址映射)

408喜欢考二维数组的存储方式(行优先)和某个元素地址的计算。

指向行的指针:

复制代码
int a[2][3];
int (*p)[3] = a;  // p是指针,指向"包含3个int的一维数组"
// a[i][j] 等价于 *(*(a+i)+j)

3.数组与指针(408重灾区)

数组名是地址常量,多数情况下退化为指向首元素的指针。

二、结构体(Structure)

本质:把不同类型的数据打包成一个整体,成员在内存中顺序存放(但非紧密)。

1.定义与使用

复制代码
struct Student {
    char name[20];
    int id;
    float score;
};  // 分号勿漏

struct Student stu1 = {"Zhang", 101, 95.5};
// 成员访问:stu1.id 或 指针->成员

2.内存对齐

对齐规则:

1.成员对齐:每个成员的起始偏移量,必须能整除自身大小(或其自身对齐值,取较小者)。

2.结构体总长:必须整除最宽成员的大小(整个结构体的对齐值)。

3.嵌套:内部结构体按其最宽成员的对齐值来对齐。

复制代码
struct S {
    char a;      // 1字节
    int b;       // 4字节
    short c;     // 2字节
};
// 分析(假设4字节对齐):
// a放在偏移0,b要从偏移4开始,c放在偏移8。
// 总长目前是10,但要整除最宽成员int(4),故总长为12。sizeof(struct S) = 12。

优化:想省空间,把内存大的成员放前面,减少内部填充。

三、指针(Pointer)

本质:存放另一个变量的内存地址的变量。指针是C语言的灵魂,也是408难点。

1.核心概念强化

指针变量:int *p = &a ------*在定义时表示类型,在执行时表示解引用。

解引用与野指针:未初始化或已释放内存的指针。访问它们是未定义行为。是题目的常见错误点。

2.多级指针

复制代码
int a = 10;
int *p = &a;
int **pp = &p;   // pp是指向指针p的指针
// **pp 的值是10

四、联合体(Union)

本质:所有成员共享同一块内存。

与结构体的区别

结构体:各成员独占空间,大小=各成员之和(考虑对齐)。

联合体:大小等于其最宽成员的大小。任一时刻只能存储一个成员的值。

五、枚举(Enum)

本质:给一组整数常量取个好几的名字

复制代码
enum Weekday { Mon = 1, Tue, Wed, ... }; // Tue=2, Wed=3...
enum Bool { FALSE, TRUE };              // FALSE=0, TRUE=1

考点:默认从0开始递增,可手动指定。常配合switch使用,增加代码可读性,但空间仍为int大小。

六、类型定义(Typedef)

本质:给已有类型取别名,不是创建新类型。在结构体和指针定义中特别能简化代码。

复制代码
typedef struct Student {
    char name[20];
    int id;
} Stu;           // Stu现在是struct Student的别名

typedef int (*FuncPtr)(int, int);  // FuncPtr是函数指针类型
FuncPtr pf = add;                  // 不用再写复杂的声明了
相关推荐
孙启超1 小时前
【AI开发之Rust】第 8 课:泛型、trait 与 trait 对象
开发语言·后端·rust
2501_933670792 小时前
经营财务岗技能栈拆解:Excel、SQL、BI、预算分析怎么准备
开发语言
老当益壮梁奶奶2 小时前
ARM 汇编学习笔记(二)启动代码、指令、函数调用与 C 混合编程
c语言·arm开发·单片机·嵌入式硬件·51单片机
数据狐(Datafox)2 小时前
1688商品列表API接口解析(附 JSON 样例)
java·开发语言·数据库·爬虫·json
小灰灰搞电子3 小时前
Rust Once 、OnceLock、LazyLock 一次性初始化详解
开发语言·后端·rust
hqyjzsb3 小时前
规划工商管理大学成长:搭建四层能力体系,重视高阶的 AI 能力建设
开发语言·人工智能·python·microsoft·职场和发展·数据挖掘·业界资讯
for_ever_love__3 小时前
爬虫项目: 获取高分电影的数据总结
开发语言·python·学习
weixin_307779133 小时前
C++代码实现MATLAB中的ode23t函数功能
开发语言·c++·算法·matlab
wuminyu3 小时前
Markword在紧凑对象头上的实现原理剖析
java·linux·c语言·jvm·c++
君顾13 小时前
24小时自助健身房系统开发实战与完整指南
java·开发语言·健身房