定义
- 在C语言中,二维数组可以看作是一种特殊的数组,它的每个元素本身又是一个数组。二维数组的一般定义形式如下:
数据类型 数组名[行数][列数];
例如: int arr[3][4]; 这里定义了一个名为 arr 的二维数组,它有3行4列,总共可以存放12个 int 类型的元素。数据类型可以是基本数据类型(如 int 、 char 、 float 等),也可以是自定义的结构体等类型。
初始化
- 分行初始化:可以按行对二维数组进行初始化,每行的元素用花括号括起来,不同行之间用逗号隔开。例如:
c
int arr[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
这样就清晰地初始化了一个2行3列的二维数组,第一行元素为1、2、3,第二行元素为4、5、6。
- 按顺序初始化:也可以不分行,直接按元素在内存中的存储顺序依次列出初始化值,编译器会按照数组的行列数来分配元素。例如: int arr[2][3] = {1, 2, 3, 4, 5, 6}; 效果和上面分行初始化是一样的。
- 部分初始化:如果初始化时提供的初值个数少于数组元素的总个数,对于数值型数组,未被初始化的元素会被自动初始化为0。例如: int arr[2][3] = { {1, 2}, {3} }; 则第一行元素为1、2、0,第二行元素为3、0、0。
存储方式
二维数组在内存中是按行顺序存储的,也就是先存储第一行的元素,接着存储第二行的元素,依次类推。例如上面定义的 int arr[3][4] 数组,其在内存中的存储顺序就好像是把所有元素排成了一维数组那样,按照 arr[0][0] 、 arr[0][1] 、 arr[0][2] 、 arr[0][3] 、 arr[1][0] 、 arr[1][1] ……这样的顺序依次存放。
访问元素
- 通过使用两个下标来访问二维数组中的元素,第一个下标表示行,第二个下标表示列。例如: arr[1][2] 表示访问二维数组 arr 中第2行(下标从0开始,所以是1代表第二行)第3列(下标从0开始,所以是2代表第三列)的元素。可以对访问到的元素进行赋值、读取等操作,比如:
c
arr[1][2] = 10; // 给arr数组第二行第三列元素赋值为10
int num = arr[1][2]; // 读取该元素的值赋给num变量
作为函数参数
- 二维数组作为函数参数时,在函数定义中,形参的声明形式一般为: 数据类型 数组名[][列数] 。需要指定列数,因为编译器要根据列数来确定每行元素的个数,从而正确地对数组进行操作。例如:
c
void printArray(int arr[][4], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
这里定义了一个函数 printArray 用于打印二维数组元素,参数 arr 接收一个二维数组(列数为4), rows 表示传入的二维数组的行数。
应用场景
- 矩阵运算:在处理数学上的矩阵相关运算(如矩阵加法、乘法等)时,二维数组可以很方便地用来存储矩阵的元素,按照矩阵运算规则对相应元素进行操作。
- 表格数据处理:模拟现实中的表格结构,例如学生成绩表,每行可以代表一个学生的各科成绩(列就对应不同科目),方便进行数据的查询、统计等操作。
注意事项
- 要确保访问二维数组元素时,下标不越界,即行下标和列下标都要在合法的范围内(大于等于0且小于定义的行数和列数),否则可能导致程序出现未定义行为,比如崩溃或者错误的计算结果。
- 在给二维数组分配内存空间(如果是动态分配的情况)时,要合理计算所需的内存大小,并且释放内存时也要按照正确的方式操作,避免出现内存泄漏等问题。