前言前面已经掌握了数组、字符串基础今天学习 C 语言的二维数组分为二维整型数组与二维字符数组。二维整型数组可以用来存储表格、矩阵数据二维字符数组专门用来存放多条字符串。在嵌入式开发当中可以用来保存多组传感器数据、多条提示文本在 LCD 屏幕、串口打印中经常使用。一、二维整型数组1. 定义格式c类型说明符 数组名[行数][列数];示例cint a[3][4]; //3行4列的整型二维数组float a[3][4]; //3行4列浮点型二维数组书写顺序行在前列在后。2. 二维数组访问格式数组名[行下标][列下标]行下标范围0 ~ 行数‑1列下标范围0 ~ 列数‑1⚠️下标同样不能越界越界会造成内存破坏嵌入式程序会出现死机、乱码等诡异问题。3. 二维数组初始化①全部初始化c//按行分组初始化int a[3][4] {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//省略{}括号也可以完成全部初始化int a[3][4] {1,2,3,4,5,6,7,8,9,10,11,12};带括号按行初始化时行数可以省略列数绝对不能省略。例int a[][4] {1,2,3,4};合法。②局部初始化没有被初始化的元素系统自动赋值为 0。cint a[3][4] {{1,2},{3,4,5},{6}};int a[3][4] {1,2,3,4}; //顺序填充剩余元素为0int a[3][4] {1,2,3,4,5,6,7,8};//只填充前2行剩下全部补0int a[3][4] {1,2,3,4,5,6,7,8,9}; //填充前2行第3行部分元素③全部元素初始化为 0cint a[3][4] {0};4. 利用 sizeof 计算二维数组的行数、列数以int a[3][4];举例csizeof(a); //整个数组总字节3*4*4 48字节sizeof(a[0][0]);//单个元素大小4字节sizeof(a[0]); //一行所占字节 4*4 16字节计算行数、列数通用公式c行数 sizeof(a) / sizeof(a[0]);列数 sizeof(a[0]) / sizeof(a[0][0]);示例cint rows sizeof(a)/sizeof(a[0]); //得到3行int cols sizeof(a[0])/sizeof(a[0][0]);//得到4列5. 二维整型数组存储特点特性说明单一性整个数组存储的数据类型完全相同例如全部为 int有序性下标有序a[0][0]、a[0][1]依次排列连续性内存中按行优先连续存放先存完第 0 行再存第 1 行依次向后内存排布顺序a[0][0] → a[0][1] → a[0][2] → a[0][3] → a[1][0] → a[1][1] ……二、二维字符型数组作用专门用来保存多个字符串。1. 定义格式cchar 数组名[行数][列数];示例cchar str[3][100];行数代表一共可以存放多少条字符串列数代表每一条字符串最大允许的字符长度包含 \0 结束符2. 二维字符数组初始化①全部初始化为 0cchar str[3][100] {0};②局部初始化写入多条字符串两种等价写法c//大括号嵌套写法char str[3][100] {{Hello},{world},{how}};//简化写法直接写字符串char str[3][100] {hello,world};3. 二维字符数组输入输出二维字符数组操作多条字符串需要搭配for 循环。⚠️注意gets()函数不安全仅作语法学习实际嵌入式项目尽量规避。输入示例代码c#include stdio.hint main(void){char str[3][100];int i;//循环输入3条字符串for(int i0 ; i3 ; i){gets(str[i]);}//循环输出for(int i0 ; i3 ; i){puts(str[i]);//也可以使用 printf(%s\n, str[i]);}return 0;}关键点str[i]就等价于第 i 个字符串的首地址不需要再加[]第二个下标。今日学习总结1. 二维数组定义格式数组名[行数][列数]列数永远不能省略初始化的时候行数可以省略2. 内存按行优先连续存储可以利用sizeof公式自动算出数组行数、列数写通用代码很实用3. 局部初始化未赋值的元素编译器自动填充 04. 二维字符数组用于存放多条字符串行数代表字符串数量列数代表单条字符串最大长度5. 二维字符数组读写多条字符串配合 for 循环str[i]代表第 i 个字符串首地址6. 嵌入式开发场景二维整型数组存多组传感器采样数据二维字符数组存放多条提示文字用于串口、LCD 屏幕显示。