在c中传递一个二维子数组
passing a 2d subarray in c
我有一个二维数组 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** A
),二维数组实现为 "jagged array"(即指向一维子数组的指针的顶级一维数组)。
如果不引入和初始化一些额外数据,就不可能创建您描述的锯齿状二维子阵列。为了生成这样的 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);
}
作为附加说明,您必须记住,在任何递归级别对 rotate
中的 A[i][j]
所做的所有修改都会影响 main
中的主二维数组.但是您在较低递归级别对 A[i]
指针所做的修改不会影响主数组(因为我们在每个递归级别都创建了一个新的独立副本)。但我认为这不是问题,因为(根据函数名称判断)所有修改可能都是通过 A[i][j]
接口完成的。顺便说一句,出于这个原因,将函数声明为
实际上更有意义
void rotate(int *const *A, int n11, int n12)
const
将阻止修改顶级指针数组,即它允许您修改二维数组的内容,但不能修改数组的结构。
无论如何,这里有一个实际应用此技术的示例:https://ideone.com/Sm40iD(我只是在那里打印二维数组)。
我有一个二维数组 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** A
),二维数组实现为 "jagged array"(即指向一维子数组的指针的顶级一维数组)。
如果不引入和初始化一些额外数据,就不可能创建您描述的锯齿状二维子阵列。为了生成这样的 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);
}
作为附加说明,您必须记住,在任何递归级别对 rotate
中的 A[i][j]
所做的所有修改都会影响 main
中的主二维数组.但是您在较低递归级别对 A[i]
指针所做的修改不会影响主数组(因为我们在每个递归级别都创建了一个新的独立副本)。但我认为这不是问题,因为(根据函数名称判断)所有修改可能都是通过 A[i][j]
接口完成的。顺便说一句,出于这个原因,将函数声明为
void rotate(int *const *A, int n11, int n12)
const
将阻止修改顶级指针数组,即它允许您修改二维数组的内容,但不能修改数组的结构。
无论如何,这里有一个实际应用此技术的示例:https://ideone.com/Sm40iD(我只是在那里打印二维数组)。