📅  最后修改于: 2023-12-03 15:28:45.405000             🧑  作者: Mango
这是2017年GATE计算机科学与信息技术考试的第二份试卷的第七个问题。该问题要求编写一个C++程序,以实现一些特定的功能。
编写一个C++程序,要求实现三个函数:
int** allocate2D(int r, int c);
这个函数应该接收两个整数参数:行数 r
和列数 c
,并返回一个二维整数数组(int** 类型)。要求在堆上分配这个二维数组,使得这个二维数组可以保存 r
行和 c
列的整数。注意此题目并没有要求初始化此二维数组。
int* getcolumn(int **p, int r, int c);
这个函数应该接收三个参数:一个二维整数数组 p
、行数 r
和列数 c
,并返回一个一维整数数组(int* 类型)。函数应该从 p
中取出第 c
列,将其保存为一个一维整数数组,并返回该数组的首地址。注意此题目并没有要求检查输入的参数是否合法。
void free2D(int **p, int r, int c);
这个函数应该接收三个参数:一个二维整数数组 p
、行数 r
和列数 c
,并释放这个二维数组所占用的内存。
allocate2D
函数这个函数需要在堆上分配一个二维整数数组。由于一维整数数组在内存中是连续存储的,因此我们可以先分配一个一维整数数组,然后再将每一行的指针指向这个一维数组中对应的区域。
int** allocate2D(int r, int c) {
int** p = new int*[r]; // 分配指针的数组,共r个指针
int* t = new int[r * c]; // 分配一维数组,共r*c个整数
for (int i = 0; i < r; i++) {
p[i] = t + i * c; // 将第i行的指针指向一维数组中的第i*c个整数
}
return p;
}
这个函数首先分配了一个指针的数组 p
,长度为 r
,每个指针指向一个一维数组对应的位置。
然后分配了一个一维数组 t
,长度为 r * c
,其中 r
表示行数,c
表示列数。
最后,遍历 p
数组,将每个指针指向一维数组中对应的区域。
getcolumn
函数这个函数需要从一个二维整数数组中取出第 c
列,将其保存为一个一维整数数组,并返回该数组的首地址。可以将其实现为一个简单的循环。
int* getcolumn(int **p, int r, int c) {
int* ret = new int[r]; // 分配一维数组,共r个整数
for (int i = 0; i < r; i++) {
ret[i] = p[i][c]; // 将第i行第j列的整数存入一维数组
}
return ret;
}
这个函数首先分配了一个一维数组 ret
,长度为 r
。
然后遍历二维数组 p
的每一行,将该行第 c
列的整数存到 ret
数组中。
free2D
函数这个函数需要释放一个二维整数数组所占用的内存。注意这里需要先释放每一行所占用的内存,然后再释放指针的数组 p
所占用的内存。
void free2D(int **p, int r, int c) {
for (int i = 0; i < r; i++) {
delete[] p[i]; // 释放一维数组
}
delete[] p; // 释放指针的数组
}
这个函数遍历每一行,释放每一行所占用的内存。
然后释放指针的数组 p
所占用的内存。
这个题目考察了对指针、内存分配和释放的基本知识。同时,这个题目也有一些值得注意的细节,如何利用一维数组来存储二维数组、如何遍历二维数组等等。