通过c中的2d子阵列

时间:2015-07-01 20:12:33

标签: c arrays pointers recursion sub-array

我有一个2D数组A和一个递归函数

`// A is a 2D array,n11: no. of rows in A, n12: no. of columns in A
void rotate(int** A, int n11, int n12)
{
    //do something
    //pass sub-array starting at A[1][1] having n11-2 rows and n12-2 columns
    rotate(???,n11-2,n12-2);
}`

A的malloc已在调用函数中完成。 该函数的原型无法修改。

1 个答案:

答案 0 :(得分:2)

根据您的函数参数声明(int** A),2D数组实现为“锯齿状数组”(即指向1D子数组的指针的顶级1D数组)。

在不引入和初始化一些额外数据的情况下,无法创建您描述的锯齿状2D子阵列。为了生成这样的2D子阵列,您必须创建一个新的顶级一维指针数组,相应地初始化它并将其传递到线下

void rotate(int **A, int n11, int n12)
{
  //pass sub-array starting at A[1][1] having n11-2 rows and n12-2 columns

  int *sub_A[n11 - 2];
  for (int i = 0; i < n11 - 2; ++i)
    sub_A[i] = &A[i + 1][1];

  rotate(sub_A, n11 - 2, n12 - 2);
}

作为补充说明,您必须记住,您在任何递归级别A[i][j]内对rotate所做的所有修改都会影响main中的主要2D数组。但是,对较低递归级别的A[i]指针所做的修改不会影响主数组(因为我们在每个递归级别创建一个新的独立副本)。但我认为这不是问题,因为(根据函数名称判断)所有修改都可能通过A[i][j]接口完成。顺便说一句,因此,将函数声明为

实际上更有意义
void rotate(int *const *A, int n11, int n12)

const将阻止修改顶级指针数组,即它将允许您修改2D数组的内容,但不能修改数组的结构。

无论如何,这里有一个实用的技术实例:https://ideone.com/Sm40iD(我只是在那里打印2D数组)。