二维数组是指包含多个一维数组的数组,也可以看作是一个表格或矩阵。在C语言中,我们可以通过使用数组的数组来创建二维数组。二维数组的元素可以通过两个索引来访问,分别表示行索引和列索引。
如:
#include <stdio.h>
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 访问和打印二维数组的元素
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
输出:
1 2 3 4
5 6 7 8
9 10 11 12
这样就定义了 一个3行4列的二维数组。
但请注意 行索引和列索引的范围分别是从0到行-1和从0到列-1,也就是从a[0][0]
。
二维数组的初始化:
在 C 语言中,二维数组的初始化可以通过多种方式进行,具体取决于你想要的初始值和数组的维度。下面列举了几种常见的二维数组初始化方法:
1. **指定全部元素的初始值**:
可以在声明二维数组的同时指定每个元素的初始值,使用嵌套的花括号 `{}` 表示每行的元素。如果部分元素没有指定初始值,则默认为0。
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
2. **部分元素的初始值**:
如果只想初始化部分元素,可以省略指定的行或列的大小,并只在初始化部分指定元素的初始值。
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7}, // 第二行只初始化了3个元素,第四个元素默认为0
{9, 10} // 第三行只初始化了2个元素,第三和第四个元素默认为0
};
3. **指定部分行的初始值**:
可以只对部分行进行初始化,其余行会被自动初始化为0。
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8}
// 第三行没有初始化,全部元素默认为0
};
4. **动态初始化**:
可以在运行时根据需要动态地为二维数组的元素赋值。
int rows = 3;
int cols = 4;
int arr[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = i * cols + j + 1;
}
}
注意
在 C 语言中,`int arr[3][]` 和 `int arr1[][3]` 这两种声明方式都是非法的,会导致编译错误。
1. `int arr[3][]`:
这种声明方式是非法的,因为在声明多维数组时,必须指定每一维的大小。在这个声明中,第二维的大小没有被指定,导致编译器无法确定数组的完整维数和大小。修正该错误需要指定第二维的大小,例如 `int arr[3][4]` 表示一个3行4列的二维数组。
2. `int arr1[][3]`:
这种声明方式是合法的,但在这种情况下,第一维的大小是不确定的,编译器会根据初始化时的元素个数来推断数组的大小。例如,`int arr1[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}` 表示一个3行3列的二维数组。第一维的大小为3,由初始化时的行数决定,第二维的大小为3,由初始化时的列数决定。
需要注意的是,C 语言中多维数组的每一维大小必须是常量,不可在运行时动态改变。如果需要在运行时动态确定多维数组的大小,可以考虑使用动态内存分配(如 `malloc()` 函数)来创建多维数组。
例如,可以使用以下方式来动态创建一个3行4列的二维整数数组:
#include <stdio.h>
#include <stdlib.h>
int main() {
int rows = 3;
int cols = 4;
int** arr = (int**)malloc(rows * sizeof(int*));
for (int i = 0; i < rows; i++) {
arr[i] = (int*)malloc(cols * sizeof(int));
}
// 现在可以使用 arr[i][j] 来访问和操作二维数组的元素
// 使用完数组后,别忘记释放动态分配的内存
for (int i = 0; i < rows; i++) {
free(arr[i]);
}
free(arr);
return 0;
}
上述代码使用了动态内存分配来创建一个3行4列的二维整数数组。动态内存分配可以在运行时根据需要确定数组的大小,但需要注意释放内存以避免内存泄漏。
整型二维数组的数组名和首元素
arr向下移动1:48个字节
arr[0]向下移动1:16个字节
Arr[0][0]向下移动1:4个字节
例题有 杨辉三角 二维数组排序。