一、二维整型数组(int 二维数组)
1. 定义方式
数据类型 数组名[行数][列数];
备注:(1)行数、列数必须是整型常量或常量表达式
(2)数据类型不能为 void
示例:
int a[2][3]; // 2行3列,总共6个元素
二维数组从“数组的数组”角度理解:
a -> int[][]
a[0] -> int[]
a[0][0] -> int
2. 二维数组元素访问
int a[2][3] = {{1,2,3}, {4,5,6}};
a[0][0] = 1
a[0][1] = 2
a[0][2] = 3
a[1][0] = 4
a[1][1] = 5
a[1][2] = 6
3. 初始化方式
(1)完全初始化
int a[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
(2)按行顺序初始化
int b[2][3] = {1,2,3,4,5,6};
(3)局部初始化(未给出的补 0)
// 其余元素为 0
int a1[2][3] = {1,2,3,4};
int b2[2][3] = {{1,2}, {3}};
(4)全部置零
int c1[2][3] = {0};
int c2[2][3] = {{0}};
4. 行可以省略,列不能省略(编译器需要列数)
int a[][3] = {1,2,3,4}; // 自动计算需要 2 行
int b[][3] = {{1,2},{3}};
5. 二维数组的内存特征
二维数组的三个特征:
(1)单一性:所有元素类型相同
(2)连续性:内存中按行存放,是一段连续空间
(3)有序性:元素有固定的行列顺序
二维数组本质:由多个一维数组组成的数组
6. 使用 sizeof 获取二维数组信息
int array_test[2][3] = {0};
int size = sizeof(array_test);
int row = sizeof(array_test) / sizeof(array_test[0]);
int col = sizeof(array_test[0]) / sizeof(array_test[0][0]);
printf("size:%d row:%d col:%d\n", size, row, col);
7. 遍历二维数组
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("row:%d col:%d value:%d\n", i, j, array_test[i][j]);
}
}
二、二维字符型数组(字符矩阵 / 字符串数组)
说明:二维字符数组用于存储多个字符串。例如:存储 5 个名字、多个单词、多个路径等。
1. 定义方式
char str[行数][列数];
示例:
char str[2][100]; // 可存储 2 个字符串,每个最长 99 个字符(1 个 '\0')
内存模型:
str -> char[][]
str[0] -> char[]
str[0][0] -> char
2. 二维字符数组的初始化
(1)按字符串初始化(最常用)
char str[2][100] = {"hello", "world"};
对应内存:
str[0] = "hello\0"
str[1] = "world\0"
(2)传统字符写法
char str2[5][32] = {
{"hello"},
{"world"},
{"1234"},
{"how"},
{"you ###"}
};
(3)全部清零
char str4[5][32] = {0};
char str5[5][32] = {{0}};
(4)省略行数(编译器自动确定行数)
char str6[][32] = {"hello", "world", "how", "are", "you"};
3. 元素访问
str[0][0] // 'h'
str[1][0] // 'w'
str[1][2] // 'r'
4. 使用 sizeof 获取二维字符数组信息
char str_test[3][100] = {0};
int size = sizeof(str_test); // 300
int row = sizeof(str_test) / sizeof(str_test[0]); // 3
int col = sizeof(str_test[0]) / sizeof(str_test[0][0]); // 100
5. 二维字符数组与字符串函数
| 函数 | 功能 | 注意点 |
|---|---|---|
strlen() | 求字符串长度 | 遇到 '\0' 结束 |
strcpy() | 字符串拷贝 | 覆盖目标内容,注意空间 |
strcmp() | 字符串比较 | 返回差值 |
strcat() | 字符串拼接 | 目标数组必须空间足够 |
示例:
strcpy(str[1], "new word");
strcat(str[0], "!!!");
int ret = strcmp(str[0], str[1]);
6. 二维字符数组 VS 字符指针数组(拓展)
| 特点 | 二维字符数组 | 字符指针数组 |
|---|---|---|
| 存储方式 | 所有字符串连续存储 | 字符串分散,存储的是指针 |
| 内存分配 | 编译期固定 | 可以指向常量或动态分配 |
| 是否可修改 | 内容可修改 | 字符串常量不可修改 |
| 用途 | 多个等长字符串 | 字符串列表、命令行参数 |
示例:
char arr1[3][20] = {"aaa", "bbb", "ccc"}; // 内容可修改
char *arr2[3] = {"aaa", "bbb", "ccc"}; // 指向只读区
三、二维数组总结
| 类型 | 用途 | 存储内容 | 优点 | 缺点 |
|---|---|---|---|---|
| 二维整型数组 | 矩阵、表格、图像数据 | int | 结构固定,连续存储 | 灵活度较低 |
| 二维字符数组 | 多个字符串 | char | 每个字符串长度固定,访问快 | 可能浪费空间 |
| 字符指针数组 | 字符串列表 | char* | 节省空间,灵活 | 字符串可能只读,容易越界 |
763

被折叠的 条评论
为什么被折叠?



