C语言
主要内容
- 数组
- 二维数组
数组
二维数组
定义
- 二维数组本质上是一个行列式的组合,也就是说二维数组由行和列两部分组成,属于多维数组。二维数组数据是通过行列进行解读。
- 二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一维数组。(也就是说数组的元素的类型可以是数组类型)
语法:
数据类型 数组名[行数][列数]; // 二维数组外层表示行数,内层表示列数
举例:
int arr[3][3] = {{11,12,13},{21,22,23},{31,32,33}}; // 正确,等价于下面写法
int arr[][3] = {{11,12,13},{21,22,23},{31,32,33}}; // 正确,广义上称之为柔性数组
int arr[3][3] = {{11,12},{21,22,23},{31}}; // 正确,等价于下面写法
int arr[3][3] = {{11,12,0},{21,22,23},{31,0,0}};// 正确
int arr[3][3] = {}; // 正确,所有的元素使用0填充
int arr[3][3] = {{11}}; // 正确,未初始化的元素使用0填充
int arr[][] = {{11,12,13},{21,22,23},{31,32,33}}; // 错误,这种写法,会编译标错,不能省略列数
int arr[3][] = {{11,12,13},{21,22,23},{31,32,33}};// 错误,这种写法,会编译标错,不能省略列数
注意:在C语言中,二维数组在计算机的存储顺序是按行进行的,即第一维的(行)下标变化慢,第二维的(列)下标变化快。
应用场合
主要应用于数据有行列要求的情况。
特殊写法
-
下标可以是整型表达式,如:
a[2-1][2*2-1]
-
下标可以是已经有值的变量或数组元素,如:
a[2*x-1][b[3][1]]
-
数组元素可以出现在表达式中,如:
b[1][2] = a[2][3]/2
注意:使用数组元素的下标应在已定义数组的大小范围内;应注意区别定义数组大小和引用数组元素的区别。
初始化
-
分行给二维数组赋初值
int arr[3][4] = {{11,12,13,14},{21,22,23,24},{31,32,33,34}};
-
可将所有数据写在一个花括号内,按照排列顺序对元素赋值
int arr[3][4] = {11,12,13,14,21,22,23,24,31,32,33,34};
-
可对部分元素赋初值,其余未赋值部分自动填充
整型默认值-0 | 字符型默认值-\0 | 浮点型默认值-0.0..
int arr[3][4] = {{11},{21,22},{31}};
-
若对全部元素赋初值,自定义数组时可以省略第1维数组的长度,第2维数组的长度必须指明。
int a[][4] = {11,12,13,14,21,22,23,24,31,32,33,34};
-
在分行赋初值时,也可以省略第1维的长度。
int arr[][4] = {{11,12,13},{0},{0,10}};
二维数组的案例
案例1:
-
需求:二维数组的遍历
-
代码:
#include <stdio.h> int main() { // 创建一个二维数组,经过论证,二维数据组必须指定列的大小,行的大小可以省略 int arr[][3] = {{11},{21,22},{31,32,33}}; // 获取二维数组的大小 int r_len = sizeof(arr) / sizeof(arr[0]); // 遍历二维数组 // 外层循环,遍历行元素(行元素是数组类型) for (int row = 0; row < r_len; row++) { // 获取行元素中列元素的个数 int c_len = sizeof(arr[row]) / sizeof(int); // 内层循环,遍历列元素(列元素是单一类型) for (int col = 0; col < c_len; col++) { // 获取元素 printf("%-3d",arr[row][col]); // 意思是获取数组arr第row行第col列 } } printf("\n"); return 0; }
案例2:
-
需求:矩阵的转置(将一个2行3列的数组转换为3行2列的数组)
-
代码:
#include <stdio.h> // 定义行和列 #define ROW 2 #define COL 3 int main() { // 准备2个数组用来存放转置前后的数列 int arr_before[ROW][COL] = {{11,12,13},{14,15,16}}; int arr_after[COL][ROW] = {0}; // 计算arr_before的大小 int r_len = sizeof(arr_before) / sizeof(arr_before[0]); // int c_len = sizeof(arr_before[0]) / sizeof(arr_before[0][0]) // 遍历 for (int i = 0; i < r_len; i++) { // 计算arr_before中行中的列数 int c_len = sizeof(arr_before[i]) / sizeof(int); for (int j = 0; j < c_len; j++) { printf("%-4d",arr_before[i][j]); // 转置 arr_after[j][i] = arr_before[i][j]; } printf("\n"); } printf("\n"); // 遍历 for (int i = 0; i < sizeof(arr_after)/sizeof(arr_after[0]);i++) { for (int j = 0; j < sizeof(arr_after[i]) / sizeof(int); j++) { printf("%-4d",arr_after[i][j]); } printf("\n"); } printf("\n"); return 0; }