我试图理解通过引用传递和传递值。在这个程序中,我有一个二维数组,在main中声明,其大小在函数中分配。在allocate2DArrayRef()函数中,我获得了两个大小并动态分配和初始化数组Array2D。
现在我试图通过指针了解如何做同样的事情。我已经编写了另一个函数allocate2DArrayPtr(),其中我传递指向二维数组的指针,获取大小的值 - sizeX和sizeY,然后将内存分配给变量secArray2D。
当我运行程序时,当我尝试打印出secArray2D时,它会挂起。我假设这意味着函数allocate2DArrayPtr()没有成功地将内存动态分配给数组secArray2D。
我的最终目标是编写一个程序,该程序具有动态分配内存的功能,并初始化从输入文件中读取的各种维度的多个数组。我知道我可以通过引用函数allocate2DArrayRef()来扩展,以实现我的目标。但我很好奇为什么我的函数allocate2DArrayPtr()不起作用,因为我想明确如何通过指针传递。我知道如何更改allocate2DArrayPtr()以返回指针,但我想将数组作为参数传递。
我正在使用Codeblocks 13.12 IDE在Windows 7上运行该程序。
#include <iostream>
using namespace std;
void allocate2DArrayRef(int **&, int &, int &);
void allocate2DArrayPtr(int ***, int *, int *);
int main()
{
int sizeX, sizeY;
int **Array2D;
allocate2DArrayRef(Array2D, sizeX, sizeY);
for(int i=0; i< sizeX; i++)
{
for(int j=0; j< sizeY; j++)
{
cout << "Array2D[" << i << "][" << j << "]:" << Array2D[i][j] << endl;
}
}
cout << endl << endl;
int **secArray2D;
allocate2DArrayPtr(&secArray2D, &sizeX, &sizeY);
for(int i=0; i<sizeX; i++)
{
for(int j=0; j<sizeY; j++)
{
cout << "secArray2D[" << i << "][" << j << "]:" << secArray2D[i][j] << endl;
}
}
return 0;
}
void allocate2DArrayRef(int **&locArray, int& indexFirst, int& indexSecond)
{
indexFirst = 4;
indexSecond = 5;
locArray = new int*[indexFirst];
for(int i=0; i<indexFirst ; i++)
{
locArray[i] = new int[indexSecond];
for(int j=0; j<indexSecond; j++)
{
locArray[i][j] = i*j;
}
}
}
void allocate2DArrayPtr(int ***locArray, int *indexFirst, int *indexSecond)
{
*indexFirst = 2;
*indexSecond = 3;
int **temp = *locArray;
temp = new int*[*indexFirst];
for(int i=0; i<(*indexFirst) ; i++)
{
temp[i] = new int[*indexSecond];
for(int j=0; j<(*indexSecond); j++)
{
temp[i][j] = i+j;
}
}
}
答案 0 :(得分:0)
allocate2DArrayPtr
不起作用的原因是您从未将locArray
设置为指向您在函数中创建的数组。这意味着当您从函数secArray2D
返回时仍然未初始化。
添加
*locArray = temp;
到allocate2DArrayPtr
结尾将解决问题。
答案 1 :(得分:0)
或者你可以像这样引用你的临时工具:
int **&temp = *locArray;