1. C语言基础核心概念回顾
昨天我们讨论了C语言中最基础的变量、运算符和控制结构,今天要深入探讨几个让初学者既爱又恨的核心概念:二维数组、指针、结构体和联合体。这些内容构成了C语言的中级知识体系,也是从"会写代码"到"写好代码"的关键跨越点。
先说说为什么这些概念如此重要。在嵌入式开发中,二维数组常用于处理传感器采集的矩阵数据;指针直接操作内存地址的特性在资源受限的系统中至关重要;结构体能够将相关数据打包管理;而联合体则能实现内存共享。这些都是实际工程中每天都要打交道的工具。
提示:学习这些概念时,建议在纸上画出内存示意图。C语言的精髓就在于理解数据在内存中的实际排布方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二维数组的深入理解与应用
2.1 二维数组的内存模型
二维数组本质上是一段连续的内存空间,只是编译器帮我们做了行列的映射。例如声明int arr[3][4]时,内存中会分配连续的12个int空间(假设int占4字节,共48字节)。
这种连续存储特性带来一个重要结论:多维数组在内存中其实并不存在,最终都会被转化为一维的连续存储。理解这一点对后续使用指针操作数组至关重要。
2.2 动态初始化二维数组
让我们实现热搜中提到的需求:用for循环生成10×3的二维数组并显示波形。这里给出完整实现:
c复制#include <stdio.h>
#define ROWS 10
#define COLS 3
int main() {
int arr[ROWS][COLS];
// 初始化数组(示例使用简单递增数值)
for(int i=0; i<ROWS; i++) {
for(int j=0; j<COLS; j++) {
arr[i][j] = i*COLS + j + 1; // 填充数据
}
}
// 打印波形图
for(int i=0; i<ROWS; i++) {
for(int j=0; j<COLS; j++) {
printf("%3d ", arr[i][j]);
// 简单波形可视化
for(int k=0; k<arr[i][j]%10; k++)
printf("*");
printf("\n");
}
printf("\n");
}
return 0;
}
2.3 二维数组作为函数参数
当需要将二维数组传递给函数时,有三种常见方式:
- 固定第二维大小:
void func(int arr[][COLS], int rows) - 使用指针数组:
void func(int *arr[], int rows, int cols) - 手动计算偏移:
void func(int *arr, int rows, int cols)
第一种方式最直观,但要求列数在编译时已知。第二种更灵活但需要额外分配指针数组。第三种最底层但效率最高。
3. 指针的深入解析
3.1 指针的本质与操作
指针就是存储内存地址的变量。在32位系统中占4字节,64位系统中占8字节。理解指针的关键在于区分三个概念:
- 指针本身(存储地址的变量)
- 指针指向的值(解引用)
- 指针的地
