【问题标题】:What is the relation between double pointer and 2d array?双指针和二维数组有什么关系?
【发布时间】:2011-07-20 14:36:40
【问题描述】:
void displayMatrix(int **ptr)
{
  printf("%d %d \n",**ptr,*(*ptr+1));
  *ptr++;
  printf("%d %d \n",**ptr,*(*ptr+1));
}

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

displayMAtrix(array); 

【问题讨论】:

  • printf 可以。传递指针到指针不是。
  • @Andre 假设数组[2][2] = {{1,2},{4,5}}
  • @furqan:那么上面的代码甚至都无法编译。
  • @furqan:指向指针数组第一个元素的指针与指向数组数组第一个元素的指针不同。 :) 如果有人告诉你“数组是指针”,他们在撒谎

标签: c++


【解决方案1】:

如果您有一个具有自动存储持续时间的二维数组(例如int matrix[2][2];),那么,这不是传递二维数组的正确方法。

int f ( int, char ** )
{
  int matrix[2][2];
  displayMatrix(matrix);
}

要符合标准(还有其他方法可以使其工作,但这是标准的推荐方法),您需要将displayMatrix() 声明为:

void displayMatrix ( int matrix[][2] );

您必须声明每个维度的大小(可能不包括第一个维度)。这背后的原因在于二维数组在内存中的存储方式。 Wikipedia 在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);
}

【讨论】:

    【解决方案2】:

    这是多维原始数组在 C++ 中如此尴尬的原因之一。如果你至少知道数组的最后一维,你可以这样做:

    void displayMatrix(int array[][2])
    {
        // code goes here
    }
    

    int** 方法仅适用于以这种方式声明的动态大小的数组。它不能与 int[2][2] 数组互换。有关正确方法的更多信息(即,当您不做家庭作业时),您可以查看this SO question

    【讨论】:

      【解决方案3】:

      我会这样做:

      struct Array2d {
         float *array;
         int size_x;
         int size_y;
      };
      void myfunction(Array2d &a) { a.array[x+y*a.size_x] = 10.0; }
      

      【讨论】:

        【解决方案4】:

        如果可以,请使用矢量

        void displayMatrix(const std::vector<int> &dat);
        

        如果失败,请不要使用数组数组,如果可以的话。自己计算偏移量。

        void displayMatrix(int *dat);
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-25
          • 1970-01-01
          • 1970-01-01
          • 2017-04-22
          • 2019-09-09
          相关资源
          最近更新 更多