深入理解二维数组创建与使用
目录
一、二维数组的创建
1、二维数组的概念
数据类型层级示例:
2、二维数组的定义
定义二维数组的语法如下:
示例:
参数说明:
二、二维数组的初始化
1、不完全初始化
2、完全初始化
3、按行初始化
4、省略行数的初始化
三、二维数组的使用
1、二维数组的下标访问
示例:
2、二维数组的输入和输出
四、二维数组的内存存储
观察输出结果可以发现:
内存布局示意图:
一、二维数组的创建
1、二维数组的概念
之前学习的数组被称为一维数组,其元素都是基本数据类型。当我们将一维数组作为数组元素时,就形成了二维数组。同理,以二维数组作为元素的数组就是三维数组。通常将二维及以上的数组统称为多维数组。
数据类型层级示例:
-
整型(int)
-
整型一维数组(int arr[5])
-
整型二维数组(int arr[3][5])
2、二维数组的定义
定义二维数组的语法如下:
type arr_name[行数][列数];
示例:
int arr[3][5]; // 3行5列的整型二维数组
double data[2][8]; // 2行8列的双精度浮点型二维数组
参数说明:
-
3
表示数组有3行 -
5
表示每行有5个元素 -
int
指定数组元素的类型为整型 -
arr
是数组名,可自定义 -
data
数组的定义方式同理
二、二维数组的初始化
初始化是指在创建变量或数组时赋予初始值。二维数组的初始化同样使用大括号完成。
1、不完全初始化
int arr1[3][5] = {1, 2}; // 仅初始化前两个元素,其余自动设为0
int arr2[3][5] = {0}; // 所有元素初始化为0
2、完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
3、按行初始化
int arr4[3][5] = {{1, 2}, // 第一行前两个元素初始化{3, 4}, // 第二行前两个元素初始化{5, 6} // 第三行前两个元素初始化
};
4、省略行数的初始化
可以省略行数(第一维),但必须指定列数(第二维),编译器会根据初始值自动推断行数。
int arr5[][5] = {1, 2, 3}; // 自动推断为1行
int arr6[][5] = {1, 2, 3, 4, 5, 6, 7}; // 自动推断为2行
int arr7[][5] = {{1, 2}, {3, 4}, {5, 6}
}; // 明确3行
三、二维数组的使用
1、二维数组的下标访问
二维数组通过行和列的下标来访问特定元素。在C语言中,行和列的下标都从0开始。
示例:
int arr[3][5] = {{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7}
};printf("%d\n", arr[2][4]); // 访问第3行第5列的元素(值为7)
2、二维数组的输入和输出
要遍历整个二维数组,可以使用嵌套循环:外层循环控制行号,内层循环控制列号。
#include <stdio.h>int main() {int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}};// 输入数组元素for(int i = 0; i < 3; i++) { // 行遍历for(int j = 0; j < 5; j++) { // 列遍历scanf("%d", &arr[i][j]);}}// 输出数组元素for(int i = 0; i < 3; i++) { // 行遍历for(int j = 0; j < 5; j++) { // 列遍历printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
四、二维数组的内存存储
通过打印每个元素的地址,可以了解二维数组在内存中的存储方式。
#include <stdio.h>int main() {int arr[3][5] = {0};for(int i = 0; i < 3; i++) {for(int j = 0; j < 5; j++) {printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}
观察输出结果可以发现:
-
同一行内的元素地址连续,相邻元素地址相差4字节(int类型大小)
-
行末元素与下一行首元素地址也相差4字节
-
整个二维数组在内存中是连续存储的
内存布局示意图:
理解二维数组的内存布局对后续使用指针访问数组元素非常重要。