【问题标题】:passing a 2d subarray in c在c中传递一个二维子数组
【发布时间】:2015-09-19 04:02:30
【问题描述】:

我有一个二维数组 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 已在调用函数中完成。 函数原型不可修改。

【问题讨论】:

  • 如果“无法修改函数的原型”,这是不可能的。因为int **与真正的二维数组不同。
  • 如果必要的信息通过全局变量传递,则可以 (rotate(A,n11-2,n12-2);)。
  • 沿着对角线,可能是一种特殊情况:a[1][1] = a + n11 * 1 + 1 等等...所以你可以通过 &a[1][1]如果你只需要对角线......或者可能不是:)

标签: c arrays pointers recursion sub-array


【解决方案1】:

根据您的函数参数声明 (int** A),二维数组被实现为“锯齿状数组”(即指向一维子数组的顶级一维数组)。

如果不引入和初始化一些额外数据,就无法创建您描述的锯齿状二维子数组。为了生成这样的 2D 子数组,您必须创建一个新的顶级 1D 指针数组,相应地对其进行初始化并将其向下传递

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] 内的 A[i][j] 所做的所有修改都将影响 main 中的主二维数组。但是您在较低的递归级别对A[i] 指针所做的修改不会影响主数组(因为我们在每个递归级别创建了一个新的独立副本)。但我认为这不是问题,因为(从函数名来看)所有修改可能都是通过A[i][j] 接口完成的。顺便说一句,出于这个原因,实际上将函数声明为更有意义

void rotate(int *const *A, int n11, int n12)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-23
    • 2011-04-20
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多