【发布时间】:2011-06-07 00:14:28
【问题描述】:
第一个问题:
对于已知维度,我们不需要 new/malloc 来创建
const int row = 3;
const int col = 2;
int tst_matrix[row][col] ={{1,2},{3,4},{5,6}}
但是,将这个二维数组传递给另一个函数并不容易,对吧?因为
int matrix_process(int in_matrix[][])
是非法的,您必须指定除第一个之外的所有维度。如果我需要更改 in_matrix 的内容,如何轻松将 tst_matrix 传递给函数 matrix_process?
第二个问题: 在 C++ 中使用 new 创建二维数组的标准方法是什么?我不想在这里使用 std::vector 等。 这是我想出的,这是最好的方法吗?
int **tst_arr = new int*[5];
int i=0, j=0;
for (i=0;i<5;i++)
{
tst_arr[i] = new int[5];
for (j=0;j<5;j++)
{
tst_arr[i][j] = i*5+j;
}
}
另外,如果我将 tst_array 传递给另一个函数,比如:
int change_row_col( int **a)
{
.....................
//check which element is 0
for (i=0; i<5; i++)
for(j=0;j<5;j++)
{
if (*(*(a+i)+j)==0) //why I can not use a[i][j] here?
{
row[i]=1;
col[j]=1;
}
}
.....................
}
另外,如果我使用((a+i)+j),结果不是我想要的。 这是我拥有的完整测试代码:
#include <iostream>
using namespace std;
//Input Matrix--a: Array[M][N]
int change_row_col( int **a)
{
int i,j;
int* row = new int[5];
int* col = new int[5];
//initialization
for(i=0;i<5;i++)
{
row[i]=0;
}
for(j=0;j<5;i++)
{
col[j]=0;
}
//check which element is 0
for (i=0; i<5; i++)
for(j=0;j<5;j++)
{
if (*(*(a+i)+j)==0) //why I can not use a[i][j] here?
{
row[i]=1;
col[j]=1;
}
}
for(i=0;i<5;i++)
for (j=0;j<5;j++)
{
if (row[i] || col[j])
{
*(*(a+i)+j)=0;
}
}
return 1;
}
int main ()
{
int **tst_arr = new int*[5];
int i=0, j=0;
for (i=0;i<5;i++)
{
tst_arr[i] = new int[5];
for (j=0;j<5;j++)
{
tst_arr[i][j] = i*5+j;
}
}
for (i=0; i<5;i++)
{
for(j=0; j<5;j++)
{
cout<<" "<<tst_arr[i][j];
}
cout<<endl;
}
change_row_col(tst_arr);
for (i=0; i<5;i++)
{
for(j=0; j<5;j++)
{
cout<<" "<<tst_arr[i][j];
}
cout<<endl;
}
for (i=0;i<5;i++)
{
delete []tst_arr[i];
}
delete []tst_arr;
}
【问题讨论】:
-
你为什么不想使用
std::vector? -
"我不想使用 std::vector" 你有什么好的理由吗?
-
好吧,如果你不想使用 std::vector,总是有 boost::array。
-
不幸的是,C 和 C++ 在这方面存在分歧。 Modern C (C99) 有可变长度的数组,这将非常适合您的目的。
-
“在 C++ 函数中传递多维数组的优雅方式”是使用“std::vector”。但是,从您的帖子中,我了解到您不想使用这种优雅。
标签: c++ pointers multidimensional-array