我试图创建一个void类型的函数来创建一个二维动态数组,并在主函数中创建某种指针以快速访问这个二维数组,但最终出现了一堆错误。我知道通过相同类型的 double 来做到这一点会更容易,但我已经想知道这是否可以通过void实现?
using namespace std;
void Array(unsigned int rows, unsigned int colms)
{
double** array2d = new double* [rows];
for (unsigned int i = 0; i < rows; i++)
array2d[i] = new double[colms];
}
int main()
{
// 1. Создание двумерного массива
unsigned int numRows = 4;
unsigned int numCols = 10;
void (*list)(unsigned int, unsigned int) = Array;
// 2. Инициализация двумерного массива
int data = 0;
for (unsigned int i = 0; i < numRows; i++)
for (unsigned int j = 0; j < numCols; j++)
{
list[i][j] = data;
data++;
}
// 3. Выводим двумерный массив в консоль
for (unsigned int i = 0; i < numRows; i++)
{
for (unsigned int j = 0; j < numCols; j++)
cout << list[i][j] << " ";
cout << endl;
}
// 4. Освобождаем память
for (unsigned int i = 0; i < numRows; i++)
{
double* p_row = list[i];
cout << i << ": " << p_row;
delete[] p_row;
cout << " -(delete[] p_row)-> " << p_row;
p_row = nullptr;
cout << " -(p_row = nullptr)-> " << p_row << endl;
}
delete[] list;
list = nullptr;
return 0;
}
当然,您写道,观看起来很痛苦,并且从函数返回时 double 也无济于事。
您还应该阅读有关将参数传递给函数的信息:
您可以在这里阅读。让我们跳过解析代码,我将向您展示如何实现这一点:
正如我们已经说过的,你可以使用 void*,但这没有意义,因为你仍然必须使用类型转换。
您已经创建了一个“本身的东西” -该函数
Array实际上创建了一个数组,该数组已安全丢失。看来您还没有弄清楚如何使用函数。你的void (*list)(unsigned int, unsigned int) = Array;不是创建一个数组,它是一个指向函数的指针,所以你对数组的所有调用list[]都是无意义的。可以通过
void*,但是这会带来什么呢?无论如何,您都会为数组分配内存double,因此double**除了将结果强制转换为类型之外,没有其他可做的 - 那么为什么要进行这些可以避免的强制转换呢?