双指针和二维数组之间有什么关系?

时间:2011-07-20 14:36:40

标签: c++

void displayMatrix(int **ptr)
{
  printf("%d %d \n",**ptr,*(*ptr+1));
  *ptr++;
  printf("%d %d \n",**ptr,*(*ptr+1));
}

将2x2数组传递给函数是否正确?

displayMAtrix(array); 

4 个答案:

答案 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);

如果您打算合法地传递数组数组,则必须指定除最大维度之外的数组大小。在我打出来之前,其他人似乎已经回答了这个问题。