news 2026/7/31 7:30:47

学嵌入式和C语言编程 | 学习日记Day9:二维整型数组、二维字符数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
学嵌入式和C语言编程 | 学习日记Day9:二维整型数组、二维字符数组

前言

前面已经掌握了数组、字符串基础,今天学习 C 语言的二维数组,分为二维整型数组二维字符数组
二维整型数组可以用来存储表格、矩阵数据;二维字符数组专门用来存放多条字符串。在嵌入式开发当中,可以用来保存多组传感器数据、多条提示文本,在 LCD 屏幕、串口打印中经常使用。

一、二维整型数组

1. 定义格式

c
类型说明符 数组名[行数][列数];

示例:

c
int 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。

c
int a[3][4] = {{1,2},{3,4,5},{6}};

int a[3][4] = {1,2,3,4}; //顺序填充,剩余元素为0

int a[3][4] = {1,2,3,4,5,6,7,8};//只填充前2行,剩下全部补0

int a[3][4] = {1,2,3,4,5,6,7,8,9}; //填充前2行+第3行部分元素

③全部元素初始化为 0

c
int a[3][4] = {0};

4. 利用 sizeof 计算二维数组的行数、列数

int a[3][4];举例

c
sizeof(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]);

示例:

c
int 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. 定义格式

c
char 数组名[行数][列数];

示例:

c
char str[3][100];

  • 行数:代表一共可以存放多少条字符串
  • 列数:代表每一条字符串最大允许的字符长度(包含 '\0' 结束符)

2. 二维字符数组初始化

①全部初始化为 0

c
char str[3][100] = {0};

②局部初始化,写入多条字符串

两种等价写法:

c
//大括号嵌套写法
char str[3][100] = {{"Hello"},{"world"},{"how"}};

//简化写法,直接写字符串
char str[3][100] = {"hello","world"};

3. 二维字符数组输入输出

二维字符数组操作多条字符串,需要搭配for 循环

⚠️注意:gets()函数不安全,仅作语法学习,实际嵌入式项目尽量规避。

输入示例代码:

c
#include <stdio.h>
int main(void)
{
char str[3][100];
int i;
//循环输入3条字符串
for(int i=0 ; i<3 ; ++i)
{
gets(str[i]);
}
//循环输出
for(int i=0 ; i<3 ; ++i)
{
puts(str[i]);
//也可以使用 printf("%s\n", str[i]);
}
return 0;
}

关键点:str[i]就等价于第 i 个字符串的首地址,不需要再加[]第二个下标。

今日学习总结

1. 二维数组定义格式数组名[行数][列数]列数永远不能省略,初始化的时候行数可以省略;
2. 内存按行优先连续存储,可以利用sizeof公式自动算出数组行数、列数,写通用代码很实用;
3. 局部初始化,未赋值的元素编译器自动填充 0;
4. 二维字符数组用于存放多条字符串;行数代表字符串数量,列数代表单条字符串最大长度;
5. 二维字符数组读写多条字符串,配合 for 循环,str[i]代表第 i 个字符串首地址;
6. 嵌入式开发场景:二维整型数组存多组传感器采样数据;二维字符数组存放多条提示文字,用于串口、LCD 屏幕显示。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 7:30:06

弹幕游戏直播话术设计与场控运营SOP大全:从开场30秒到礼物转化率翻倍的实战手册(2026版)

弹幕游戏直播间70%的流失发生在前30秒&#xff0c;80%的礼物转化依赖话术触发时机而非话术长度。本文系统拆解弹幕游戏直播话术设计的底层逻辑、全流程话术模板&#xff08;开场/互动/转化/沉淀/下播&#xff09;、分品类差异化话术策略、场控运营SOP标准化流程、话术A/B测试方…

作者头像 李华
网站建设 2026/7/31 7:22:14

医学研究中的偏倚:识别、控制与统计校正实战指南

1. 从一次失败的临床研究复盘说起几年前&#xff0c;我参与过一个关于某种新型降压药疗效的观察性研究。数据收上来后&#xff0c;结果“好”得惊人&#xff1a;与常规治疗组相比&#xff0c;新药组的患者血压达标率高出近40%&#xff0c;心血管事件发生率也显著降低。团队一度…

作者头像 李华
网站建设 2026/7/31 7:08:41

Vivado仿真卡死:系统性排查与解决方案全解析

1. 项目概述&#xff1a;当Vivado仿真“卡死”时&#xff0c;我们到底在对抗什么&#xff1f; 如果你正在用Vivado做FPGA开发&#xff0c;那么“仿真跑不下去”这个场景&#xff0c;大概率是你迟早要面对的。它不是简单的报错&#xff0c;而是一种更令人沮丧的状态&#xff1a;…

作者头像 李华