第二节 二维数组
-
二维数组的定义
-
二维数组的初始化
-
二维数组的引用
6.2.1二维数组的定义
1.格式:类型 数组名[常量表达式1][常量表达式2];
2.说明:定义二维数组即在内存中开辟一块连续的常量表达式1 *常量表达式2*类型所占字节数大小的空间。
类型:除void类型以外任一种基本数据类型或构造数据类型,表示数据所有元素的类型。
数组名:一种用户自定义并符合变量名命名规则的标识符,表示数组名和数组首行首元素首字节地址。
常量表达式1:用整型常量或值为整型的常量表达式表示数组行数。
常量表达式2:用整型常量或值为整型的常量表达式表示数组每行元素个数。
3.注意:
①在C语言中,二维数组每行的元素数量是由定义的时候决定的,并保持一致。
②数组名表示一个地址常量,是多个行多个元素的统称;数组名 [常量表达式1]也是一个表示该行首元素首地址的常量,是该行多个元素的统称。
③如果在定义时直接进行初始化,可以不加常量表达式1表示行,机器根据初始化元素数量以一次开辟一行的方式直至包含所有初始化元素。
6.2.2二维数组的初始化
1.说明:数组在定义的时候可以利用赋值号加包含元素的“{}”进行初始化,因为是二维数组,所以可以根据“{}”的嵌套关系,依次对每行和每行元素进行初始化。
2.初始化规则:
①部分初始化:在采用两级“{}”初始化时,对于“{}”中的元素依次赋值,对于没有表示的元素,只要初始化了就均为0;而只采用一级“{}”初始化时,将“{}”中的值按行依次赋值。
②完全初始化:即对数组每个元素均进行赋值,初始化的数量不可以超过二维数组总数。
#include <stdio.h>int main() {// 示例1:完整初始化int matrix1[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};printf("Example 1: \n");int i,j; for (i = 0; i < 3; ++i) {for (j = 0; j < 4; ++j) {printf("%d ", matrix1[i][j]);}printf("\n");}// 示例2:部分初始化int array2[4][5] = {{1, 2, 3}, // 剩余元素自动初始化为0{4, 5, 6, 7, 8}, {9} // 仅初始化第一个元素,其余元素默认为0};printf("\nExample 2: \n");for ( i = 0; i < 4; ++i) {for ( j = 0; j < 5; ++j) {printf("%d ", array2[i][j]);}printf("\n");}// 示例3:忽略行数int arr3[][3] = {1, 2, 3, 4, 5, 6};printf("\nExample 3: \n");for ( i = 0; i < sizeof(arr3)/sizeof(arr3[0]); ++i) {for ( j = 0; j < 3; ++j) {printf("%d ", arr3[i][j]);}printf("\n");}// 示例4:动态初始化int rows = 3;int cols = 4;int dynamic_matrix[rows][cols];for ( i = 0; i < rows; ++i) {for ( j = 0; j < cols; ++j) {dynamic_matrix[i][j] = i * cols + j + 1;}}printf("\nExample 4: \n");for ( i = 0; i < rows; ++i) {for ( j = 0; j < cols; ++j) {printf("%d ", dynamic_matrix[i][j]);}printf("\n");}// 示例5:通过指针访问二维数组(此例中不涉及初始化,只展示如何通过一维数组访问)int flat_array[3 * 4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};int (*ptr)[4] = (int (*)[4])flat_array;printf("\nExample 5: \n");for ( i = 0; i < 3; ++i) {for ( j = 0; j < 4; ++j) {printf("%d ", ptr[i][j]);}printf("\n");}return 0;}
6.2.3二维数组的引用
1.说明:引用即是采用下面形式,对数组中元素经行操作。
2.形式:数组名 [下标表达式1][下标表达式2]
3.注意:
①依次表示数组元素时,行列下标是从0开始的,并且行列最大下标不得大于等于定义值。
②下标表达式的值要为整数。
③二维数组在内存中是按行依次存储的,即 数组名[下标表达式1] [下标表达式2]= *(数组名+下标表达式1*常量表达式2+下标表达式2) ,所以在 数组名[0][下标表达式] 这种形式中直接改变下标表达式的值如同操作一维数组。