多维数组-知识总结 多维数组概念 数组是用于存储多个数据的线性数据结构。数组的数据在内存中是连续存储的,并且一个数组内存储的数据必须是同类型的,在定义数组的时候需要同时确定数组的大小。
多维数组就是数组的数组,可以用来存储矩阵、表格等多维数据。 例如: 二维数组:一维数组的数组 三维数组:二维数组的数组 四维数组:三维数组的数组 ……
多维数组的定义和使用与一维数组类似,但增加了更多维度。以下是关于多维数组的定义、初始化、访问元素和传递给函数的详细介绍。
多维数组的定义 多维数组的定义语法如下:
type arrayName[size1][size2]...[sizeN];多维数组的定义代码示例:
int arr2[2][3]; // 定义二维数组,2个大小为3的一维数组
int arr3[4][2][3]; // 定义三维数组,4个二维数组,每个二维数组中有2个大小为3的一维数组
int arr4[5][4][2][3]; // 定义四维数组,5个三维数组,每个三维数组中有4个二维数组多维数组的初始化 序列初始化 使用{}的方式对数组进行初始化,必须在定义数组时对其进行初始化。若{}内填写数组,则按照顺序对数组内元素进行赋值,未填写部分补0。
二维数组序列初始化方式代码示例:
1#include <iostream>
2using namespace std;
3
4int main() {
5 // 定义一个2x3的二维数组,并直接初始化
6 // 表示该二维数组中有2个大小为3的一维数组
7 // 每行为一个一维数组的初始化数据
8 int arr[2][3] = {
9 {1, 2, 3}, // 第一行
10 {4, 5, 6} // 第二行
11 };
12 return 0;
13}三维数组序列初始化方式代码示例:
1#include <iostream>
2using namespace std;
3
4int main() {
5 // 定义一个2x2x3的三维数组,并直接初始化
6 // 表示该三维数组中有2个二维数组,每个二维数组中有2个大小为3的一维数组
7 // 每行为一个一维数组的初始化数据
8 int arr[2][2][3] = {
9 {
10 {1, 2, 3}, // 第一层第一行
11 {4, 5, 6} // 第一层第二行
12 },
13 {
14 {7, 8, 9}, // 第二层第一行
15 {10, 11, 12} // 第二层第二行
16 }
17 };
18 return 0;
19}filln初始化
需要添加头文件:
1#include <iostream>
2#include <algorithm>
3using namespace std;
4
5int main () {
6 int arr[2][3];
7 fill_n(&arr[0][0], 2 * 3, -1);
8 return 0;
9}memset初始化 memset是C语言风格的初始化方式,可以在任意位置对数组进行赋值,将数组元素全部设置为某一个值。 使用memset需要填写三部分内容:数组名称、初始化数值和数组大小。 其中初始化的数值一般使用16进制表示常用数值为:0、1、-1、0x3f、0x7f,其中0x3f和0x7f都表示一个比较大的整数。 另外数组大小不是数组里面存储的数值的个数,而是占用内存的大小。
1#include <iostream>
2#include <algorithm>
3using namespace std;
4
5int arr[105][105];
6
7int main () {
8 memset(arr, 0, sizeof(arr));
9 memset(arr, 1, sizeof(arr));
10 memset(arr, -1, sizeof(arr));
11 memset(arr, 0x3f, sizeof(arr));
12 memset(arr, 0x7f, sizeof(arr));
13 return 0;
14}将数组初始化为全0的几种方式
arr[2][3] = {};
arr[2][3] = {0};
arr[2][3] = {{}, {}};
fill_n(&arr[0][0], 2 * 3, 0);
memset(arr, 0, sizeof(arr));多维数组元素的访问 我们使用:数组名称[下标1][下标2][…]的形式访问数组,可以通过该方式获得到下标位置的元素的值或者对该位置进行赋值。
二维数组代码示例:
1#include <iostream>
2using namespace std;
3
4int main() {
5 // 定义一个2x3的二维数组
6 int arr[2][3] = {
7 {1, 2, 3}, // 第一行
8 {4, 5, 6} // 第二行
9 };
10
11 // 访问和输出二维数组的元素
12 for (int i = 0; i < 2; ++i) {
13 for (int j = 0; j < 3; ++j) {
14 cout << arr[i][j] << " ";
15 }
16 cout << std::endl;
17 }
18
19 return 0;
20}三维数组代码示例:
1#include <iostream>
2using namespace std;
3
4int main() {
5 // 定义一个2x3x4的三维数组
6 int arr[2][3][4] = {
7 {
8 {1, 2, 3, 4},
9 {5, 6, 7, 8},
10 {9, 10, 11, 12}
11 },
12 {
13 {13, 14, 15, 16},
14 {17, 18, 19, 20},
15 {21, 22, 23, 24}
16 }
17 };
18
19 // 访问和输出三维数组的元素
20 for (int i = 0; i < 2; ++i) {
21 for (int j = 0; j < 3; ++j) {
22 for (int k = 0; k < 4; ++k) {
23 cout << arr[i][j][k] << " ";
24 }
25 cout << std::endl;
26 }
27 cout << std::endl;
28 }
29
30 return 0;
31}访问数组元素需要注意几点: 下标从0开始,到数组个数-1结束,即如果数组的元素个数为n,第一个元素对应的下标为0,第二个元素对应的下标为1,最后一个元素对应的下标为n-1。 数组下标不可以为负数,如果是用arr[i-1]这样的操作时,一定要注意检查i-1是否大于等于0。 数组下标不可以越界使用,即如果数组的元素个数为n,不能使用超过n-1的下标,如果是用arr[i+1]这样的操作时,一定要注意检查i+1是否小于n。 对于越界使用数组下标的情况,编译器不会报错,但是程序运行时会出现错误,所以必须谨慎使用。
多维数组函数传参 在传递多维数组给函数时,除了第一个维度外,其他维度的大小必须在函数参数中明确指定。注意这里的大小要是整个数组的大小。
二维数组传参代码示例:
1#include <iostream>
2using namespace std;
3
4// 打印二维数组的函数
5void print2DArray(int arr[][3], int rows, int colums) {
6 for (int i = 0; i < rows; ++i) {
7 for (int j = 0; j < colums; ++j) {
8 cout << arr[i][j] << " ";
9 }
10 cout << endl;
11 }
12}
13
14int main() {
15 int arr[2][3] = {
16 {1, 2, 3},
17 {4, 5, 6}
18 };
19
20 print2DArray(arr, 2);
21 return 0;
22}三维数组传参代码示例:
1#include <iostream>
2using namespace std;
3
4// 打印三维数组的函数
5void print3DArray(int arr[][3][4], int size1, int size2, int size3) {
6 for (int i = 0; i < size1; ++i) {
7 for (int j = 0; j < size2; ++j) {
8 for (int k = 0; k < size3; ++k) {
9 cout << arr[i][j][k] << " ";
10 }
11 cout << endl;
12 }
13 cout << endl;
14 }
15}
16
17int main() {
18 int arr[2][3][4] = {
19 {
20 {1, 2, 3, 4},
21 {5, 6, 7, 8},
22 {9, 10, 11, 12}
23 },
24 {
25 {13, 14, 15, 16},
26 {17, 18, 19, 20},
27 {21, 22, 23, 24}
28 }
29 };
30
31 print3DArray(arr, 2);
32 return 0;
33}错误的题目要弄懂,不会的千万要来问老师⚠️
总结作业非常重要,请务必认真完成✔️
考试只有一次提交机会,请务必本地检查正确后再提交❇️
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
L2-20.多维数组-选择题 在C++中,如何声明一个3行4列的二维整数数组?
A) int arr[3][4];
B) int arr[4][3];
C) int arr[][3];
D) int arr[3, 4];如何初始化下面的二维数组的所有元素为0?
A) int arr[4][2] = {0};
B) int arr[4][2] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}};
C) int arr[4][2] = {{0}};D) 全都是
在C++中,如果你有一个 int arr[2][3] 的二维数组,arr[1][2] 表示什么? A) 第一行第二列的元素 B) 第二行第三列的元素 C) 第一行第三列的元素 D) 第二行第二列的元素
如何传递一个二维数组到一个函数? A) void processArray(int arr[][], int rows, int columns) B) void processArray(int** arr, int rows, int columns) C) void processArray(int arr[][3], int rows, int columns) D) void processArray(int[2][3] arr, int rows, int columns)
一个rows行cols列的二维数组,如何访问其最后一个元素? A) arr[-1][-1] B) arr[size - 1][size - 1] C) arr[length - 1][width - 1] D) arr[rows - 1][cols - 1]
在C++中,二维数组可以看作是什么? A) 一个数组的数组 B) 两个独立的数组 C) 一个多维数据结构 D) 一个大的一维数组
在C++中,二维数组的传递是否总是通过引用进行? A) 是,总是通过引用 B) 否,可以通过值传递 C) 取决于数组的类型 D) 只在使用指针时
一个三维数组定义为 long long array[6][6][6]; ,则array[1][2][3]和 array[3][2][1]在内存中的 位置相差多少字节?( ) A) 70字节 B) 198字节 C) 560字节 D) 无法确定
下列关于C++语言中数组的叙述 ,不正确的是( )。 A) 一维数组可以用来表示数列。 B) 二维数组可以用来表示矩阵。 C) 电子表格三维数组可以用来表示空间中物体的形状。 D) 世界是三维的,所以定义四维数组没有意义。
一个二维数组定义为 char array[3][10]; ,则这个二维数组占用内存的大小为( )。 A) 10 B) 30 C) 32 D) 48
L2-20.多维数组-选择题答案 A 解析:A选项声明了一个3行4列的二维整数数组。arr[3][4]表示数组有3个元素,每个元素都是一个包含4个整数的数组(即一个4列的数组)。这是正确的声明方式。 D 解析:A选项在当使用这种方式初始化数组时,未明确指定的元素将被初始化为0。 B选项它显式地将数组的每个元素都初始化为0。虽然这种方法更冗长,但它确实可以达到目的。 C选项从代码清晰性的角度来看,方法可能不如A或B选项直观。 B 解析:多维数组的索引也都是从0开始,所以是第二行第三列 C 解析:传递二维数组到函数时,必须指定最内层维度的大小。 D 解析:根据题目,二维数组有rows行和cols列。由于数组索引是从0开始的,所以最后一行的索引是rows - 1,最后一列的索引是cols - 1。因此,arr[rows - 1][cols - 1]正确地访问了二维数组的最后一个元素。 A 解析:在C++中,二维数组也是一个数组,其中每个元素本身又是一个数组。 A 解析: C 本题属于考察C++三维数组知识。数组是long long类型,每间隔一下 数字就间隔8个字节,假设三维数组用长宽高来描述,array[0][0][0]到 array[0][5][5]有36个元素,array[1][2][3]包含36+12+4=52个元素;到长度3宽度 2高度1,包括363+12+2=122个元素,隔离70个元素,因此长度是560,选C。 D 解析:数组的维度与物理世界的维度没有直接关系。 B 本题属于考察C++二维字符数组知识。内存大小和数组需要用的空间 有关。3行10列,需要310=30个空间,选B。
L2204题解+参考代码 题目链接 矩阵转置:L2204
题解 我们需要对一个 n 行 m 列的矩阵进行转置。转置矩阵是指将矩阵沿主对角线翻转,即将第 i 行第 j 列的元素变为第 j 行第 i 列的元素。
算法步骤 读取输入:读取矩阵的行数 n 和列数 m。 读取矩阵元素:读取矩阵的每个元素,存储在二维数组中。 创建转置矩阵:创建一个 m 行 n 列的矩阵。 填充转置矩阵:将原矩阵的第 i 行第 j 列元素赋值给转置矩阵的第 j 行第 i 列。 输出转置矩阵:输出转置矩阵的每个元素。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() {
5 // 读取输入
6 int n, m;
7 cin >> n >> m;
8 int A[100][100], transpose[100][100];
9
10 // 读取矩阵元素
11 for (int i = 0; i < n; ++i) {
12 for (int j = 0; j < m; ++j) {
13 cin >> A[i][j];
14 }
15 }
16
17 // 创建并填充转置矩阵
18 for (int i = 0; i < n; ++i) {
19 for (int j = 0; j < m; ++j) {
20 transpose[j][i] = A[i][j];
21 }
22 }
23
24 // 输出转置矩阵
25 for (int i = 0; i < m; ++i) {
26 for (int j = 0; j < n; ++j) {
27 if (j > 0) cout << " ";
28 cout << transpose[i][j];
29 }
30 cout << endl;
31 }
32
33 return 0;
34}L2205题解+参考代码 题目链接 蛇形填数:L2205
题解 我们需要在大小为 n 的方阵里依次填入 1 到 n × n 的整数,要求从右上角开始向下按照蛇形填写。
算法步骤 初始化方阵: 创建一个大小为 n × n 的二维数组,并将其初始化为全零数组。 设置初始位置和方向: 初始位置设为右上角,即 (0, n-1)。 初始方向设为向下,即 (dx = 1, dy = 0)。 填充方阵: 使用一个循环从 1 到 n × n 的整数进行填充。 在每次填充时,计算下一个位置 (nx, ny): nx = x + dx ny = y + dy 检查边界条件或是否已经填充: 如果 nx 或 ny 超出边界,或者 matrix[nx][ny] 已经被填充,则改变方向。 方向变化顺序为:向下 -> 向左 -> 向上 -> 向右 -> 向下。 根据更新后的方向调整当前的位置 (x, y): x += dx y += dy 输出方阵: 遍历方阵 matrix,输出每行的数字,并确保每行的数字之间用空格隔开。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() {
5 // 读取输入
6 int n;
7 cin >> n;
8
9 // 初始化方阵
10 int matrix[20][20] = {0};
11
12 // 设置初始位置和方向
13 int x = 0, y = n - 1;
14 int num = 1;
15 int dx = 1, dy = 0; // 初始方向向下
16
17 // 填充方阵
18 while (num <= n * n) {
19 matrix[x][y] = num++;
20 int nx = x + dx;
21 int ny = y + dy;
22
23 // 检查边界条件或是否已经填充
24 if (nx < 0 || nx >= n || ny < 0 || ny >= n || matrix[nx][ny] != 0) {
25 if (dx == 1 && dy == 0) { // 向下 -> 向左
26 dx = 0; dy = -1;
27 } else if (dx == 0 && dy == -1) { // 向左 -> 向上
28 dx = -1; dy = 0;
29 } else if (dx == -1 && dy == 0) { // 向上 -> 向右
30 dx = 0; dy = 1;
31 } else if (dx == 0 && dy == 1) { // 向右 -> 向下
32 dx = 1; dy = 0;
33 }
34 }
35
36 // 更新位置
37 x += dx;
38 y += dy;
39 }
40
41 // 输出方阵
42 for (int i = 0; i < n; ++i) {
43 for (int j = 0; j < n; ++j) {
44 if (j > 0) cout << " ";
45 cout << matrix[i][j];
46 }
47 cout << endl;
48 }
49
50 return 0;
51}