C 如何将2D动态分配的数组传递给函数?

C 如何将2D动态分配的数组传递给函数?,c,pointers,multidimensional-array,C,Pointers,Multidimensional Array,在我的C代码中,在我的函数main中动态分配了一个二维数组。我需要把这个2D数组传递给一个函数。由于数组的列和行是运行时变量,我知道传递它的一种方法是: -将行和列变量以及指针传递给数组的[0][0]元素 myfunc(&arr[0][0],rows,cols) 然后在调用的函数中,将其作为“展平”1D数组访问,如: ptr[i*cols+j] 但我不想这样做,因为这意味着代码中会有很多变化,因为在前面,传递给这个函数的2D数组是静态分配的,其维度在编译时是已知的 那么,我如何将一个

在我的C代码中,在我的函数main中动态分配了一个二维数组。我需要把这个2D数组传递给一个函数。由于数组的列和行是运行时变量,我知道传递它的一种方法是:

-将行和列变量以及指针传递给数组的[0][0]元素

myfunc(&arr[0][0],rows,cols)
然后在调用的函数中,将其作为“展平”1D数组访问,如:

ptr[i*cols+j]
但我不想这样做,因为这意味着代码中会有很多变化,因为在前面,传递给这个函数的2D数组是静态分配的,其维度在编译时是已知的

那么,我如何将一个2D数组传递给一个函数,并且仍然能够使用它作为一个带有两个索引的2D数组,如下所示

arr[i][j].

任何帮助都将不胜感激。

如果不更改大量代码,您真的无法做到这一点。我建议将其包装在一个包含限制的结构中,然后使用regexp search'n'replace修复访问


可能使用类似于
AA(arr,i,j)
(如在数组访问中)的宏,其中
arr
是结构。

据我所知,您可以传递给函数的只是指向数组第一个元素的指针。当您将实际数组传递给函数时,会说“数组将衰减为指针”,因此不会保留有关指向数组大小的信息

表达式中出现的对类型为array-of-T的对象的引用(有三个例外)衰减为指向其第一个元素的指针;结果指针的类型是指向T的指针

我相信您可以在上找到更多关于这方面的信息。

(一本主要讨论矩阵的书)提出了一种方法,可以干净地完成这项工作,并且仍然可以处理二维矩阵。查看第1.2节“矩阵和二维阵列”和方法


本质上,您需要分配一组指针来指向行向量。并将其与行数和列数一起传递给函数

如果您的编译器支持C99可变长度数组(如GCC),则可以声明如下函数:

int foo(int cols, int rows, int a[][cols])
{
    /* ... */
}
您还可以在调用代码中使用指向VLA类型的指针:

int (*a)[cols] = calloc(rows, sizeof *a);
/* ... */
foo(cols, rows, a);

C中的二维数组就是数组的数组。给你:

void with_matrix(int **matrix, int rows, int cols) {
    int some_value = matrix[2][4];
}

int main(int argc, char **argv) {
    int **matrix;
    ... create matrix ...
    with_matrix(matrix, rows, cols);
}

请参阅下面的代码。将二维数组基位置作为双指针传递到
myfunc()
后,您可以使用
s[i][j]
通过索引访问数组中的任何特定元素

#包括
#包括
void myfunc(整数**s,整数行,整数列)
{
对于(int i=0;i
int cols=4;
int行=3;
字符**字符数组=新字符*[行];
对于(int i=0;i所以基本上你是说-没有编程的方式来完成它,但是“搜索和替换”。这是正确的吗?这是-虽然代码在mem.alloc部分有轻微的错误..但是得到了要点。请添加更多关于你尝试做什么的信息
int cols = 4;
    int rows = 3;
    char** charArray = new char*[rows];
    for (int i = 0; i < rows; ++i) {
        charArray[i] = new char[cols];
    }

    // Fill the array
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            charArray[i][j] = 'a';
        }
    }

    // Output the array
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            cout << charArray[i][j];
        }
        cout << endl;
    }