什么是二维数组?
在C语言中,数组是一种存储相同类型数据元素的集合。二维数组是数组的一种特殊形式,它由行和列组成的矩阵。每个元素有两个下标,第一个下标表示行,第二个下标表示列。它的定义形式为:
int arr[num_rows][num_cols];
其中,num_rows
和num_cols
分别表示数组的行数和列数,可以是常量或变量。
二维数组元素在内存中的存放顺序
在C语言中,数组元素在内存中是一段连续的存储区域。对于二维数组,它的元素存储顺序与定义顺序有关。在定义时,每行的元素是连续存放的,不同行的元素之间也是连续存放的。具体来说,它们的内存布局如下:
第一行的元素从数组的起始地址开始存放,依次排列,直到第一行结束。
第二行的元素从第一行的末尾地址开始存放,依次排列,直到第二行结束。
以此类推,直到最后一行的元素存放完毕。
可以通过以下代码验证二维数组元素在内存中的存放顺序:
#include<stdio.h>
int main() {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
printf("&arr[0][0]: %p\n", &arr[0][0]);
printf("&arr[0][1]: %p\n", &arr[0][1]);
printf("&arr[0][2]: %p\n", &arr[0][2]);
printf("&arr[1][0]: %p\n", &arr[1][0]);
printf("&arr[1][1]: %p\n", &arr[1][1]);
printf("&arr[1][2]: %p\n", &arr[1][2]);
return 0;
}
运行结果为:
&arr[0][0]: 0x7ffd3c8b0990
&arr[0][1]: 0x7ffd3c8b0994
&arr[0][2]: 0x7ffd3c8b0998
&arr[1][0]: 0x7ffd3c8b099c
&arr[1][1]: 0x7ffd3c8b09a0
&arr[1][2]: 0x7ffd3c8b09a4
由结果可知,二维数组的存放顺序为按行存放(即第一行的元素在前,第二行的元素在后)。
二维数组的应用
矩阵的存储和运算
二维数组常用于存储矩阵,并进行相应的运算,如矩阵加、减、乘、转置等操作。例如,以下代码实现了两个矩阵的相加:
#include<stdio.h>
#define ROWS 2
#define COLS 3
void matrix_addition(int arr1[][COLS], int arr2[][COLS], int res[][COLS]) {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
res[i][j] = arr1[i][j] + arr2[i][j];
}
}
}
int main() {
int arr1[ROWS][COLS] = {{1, 2, 3}, {4, 5, 6}};
int arr2[ROWS][COLS] = {{7, 8, 9}, {10, 11, 12}};
int res[ROWS][COLS] = {0};
matrix_addition(arr1, arr2, res);
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
printf("%d ", res[i][j]);
}
printf("\n");
}
return 0;
}
运行结果为:
8 10 12
14 16 18
可见,得到了正确的结果。
图像处理
二维数组还常用于图像的处理,比如存储和处理图片像素值。每个像素可以用一个二维数组元素来表示,由此就可以对图片进行各种处理操作。
总结
在C语言中,二维数组是由行和列组成的矩阵,元素存储顺序与定义顺序有关,在内存中是按行存放的。二维数组常用于存储矩阵,并进行相应的运算,也常用于图像处理。