void displayMatrix(int **ptr)
{
printf("%d %d \n",**ptr,*(*ptr+1));
*ptr++;
printf("%d %d \n",**ptr,*(*ptr+1));
}
将2x2数组传递给函数是否正确?
displayMAtrix(array);
答案 0 :(得分:3)
如果您的2D阵列具有自动存储持续时间(例如int matrix[2][2];
),那么否,这不是传递2D阵列的正确方法。
int f ( int, char ** )
{
int matrix[2][2];
displayMatrix(matrix);
}
要符合标准(还有其他方法可以使其工作,但这是标准的,推荐的方式),您需要将displayMatrix()
声明为:
void displayMatrix ( int matrix[][2] );
您必须声明每个维度的大小(可能不包括第一个维度)。这背后的原因在于2D阵列存储在内存中的方式。维基百科在row-major order上有一篇很好的文章解释了布局。
如果你正在分配大型矩阵(例如用于存储图像),你通常会得到双指针,因为你将以不同的方式分配内存。在这种情况下,您通常有一个指针数组,每个项目存储指向表示行(或列)的一维数组的指针。
在这种情况下,你会得到类似的东西:
// this function is over-simplified. it may leak memory if any
// but the first `new` throws `std::bad_alloc`.
int ** new_matrix ( int m, int n )
{
int ** matrix = new int*[m];
for (int i = 1; (i < m); ++i ) {
matrix[i] = new int[n];
}
return (matrix);
}
void displayMatrix ( int ** matrix, int m, int n );
int main ( int, char ** )
{
int **const matrix = new_matrix(2, 2);
displayMatrix(matrix, 2, 2);
}
答案 1 :(得分:0)
这是多维原始数组在C ++中如此笨拙的原因之一。如果你至少知道数组的最后一个维度,你可以这样做:
void displayMatrix(int array[][2])
{
// code goes here
}
int**
方法仅适用于以此方式声明的动态大小的数组。它与int[2][2]
数组不可互换。有关正确方式的更多信息(即,当您没有完成家庭作业时),可以查看this SO question。
答案 2 :(得分:0)
我会这样做:
struct Array2d {
float *array;
int size_x;
int size_y;
};
void myfunction(Array2d &a) { a.array[x+y*a.size_x] = 10.0; }
答案 3 :(得分:0)
如果可以提供帮助,请使用矢量
void displayMatrix(const std::vector<int> &dat);
如果失败,请不要使用数组数组,如果可以的话。自己计算偏移量。
void displayMatrix(int *dat);
如果您打算合法地传递数组数组,则必须指定除最大维度之外的数组大小。在我打出来之前,其他人似乎已经回答了这个问题。