如何在C中传递函数中的2D数组(矩阵)?

如何在C中传递函数中的2D数组(矩阵)?,c,multidimensional-array,parameter-passing,C,Multidimensional Array,Parameter Passing,我也需要这样做来保持矩阵上的操作。这是否意味着它需要通过引用传递 这够了吗 void对_矩阵(char矩阵[][20])进行运算我不知道你说的“数据不要丢失”是什么意思。以下是如何将普通二维数组传递给函数: void myfunc(int arr[M][N]) { // M is optional, but N is required .. } int main() { int somearr[M][N]; ... myfunc(somearr); ... } C并没有真

我也需要这样做来保持矩阵上的操作。这是否意味着它需要通过引用传递

这够了吗


void对_矩阵(char矩阵[][20])进行运算

我不知道你说的“数据不要丢失”是什么意思。以下是如何将普通二维数组传递给函数:

void myfunc(int arr[M][N]) { // M is optional, but N is required
  ..
}

int main() {
  int somearr[M][N];
  ...
  myfunc(somearr);
  ...
}

C并没有真正的多维数组,但有几种方法可以模拟它们。将此类数组传递给函数的方式取决于用于模拟多维的方式:

1) 使用数组的数组。只有在编译时完全确定数组边界,或者编译器支持以下操作时,才能使用此选项:

#定义第4行
#定义COLS 5
void func(整型数组[行][COLS])
{
int i,j;
对于(i=0;i2D数组:

int sum(int array[][COLS], int rows)
{

}
3D阵列:

int sum(int array[][B][C], int A)
{

}
4D阵列:

int sum(int array[][B][C][D], int A)
{

}
和nD阵列:

int sum(int ar[][B][C][D][E][F].....[N], int A)
{

}
传递可变长度2D数组的最简单方法 C++中最干净的技术是:像一维数组一样传递2D数组,然后在函数内使用2D。< /P>
#include <stdio.h>

void func(int row, int col, int* matrix){
    int i, j;
    for(i=0; i<row; i++){
        for(j=0; j<col; j++){
            printf("%d ", *(matrix + i*col + j)); // or better: printf("%d ", *matrix++);
        }
        printf("\n");
    }
}

int main(){
    int matrix[2][3] = { {0, 1, 2}, {3, 4, 5} };
    func(2, 3, matrix[0]);

    return 0;
}
#包括
void func(整数行、整数列、整数*矩阵){
int i,j;

对于(i=0;iRandom factoid):之所以需要N,是因为计算机需要知道每行指针的递增距离。真的,除了第一个维度外,所有维度都是必需的。C将数组存储为内存块,没有分隔符。数据不丢失意味着不使用malloc。谢谢您的帮助。@Christian Mann:这是一个很好的factoid。我今天碰巧写了一个详细的解释:-)今天似乎每个人都有多维数组的问题。:)我在另一个问题中也写了类似的解释:@ChristianMann相反,数组语法之所以有效,是因为编译器将参数中的数组声明调整为指向第一个元素的指针,在本例中为
int(*)[N]
。这也是为什么除了最外层的维度外,所有维度都必须提供的原因-数组只衰减一次。这与“计算机需要知道的”毫无关系。无意义。将其与1D情况比较:
void func(int[n])
,它被调整为
void func(int*)
所有大小信息都丢失了—“计算机”什么都不知道,编译器也不在乎。按照上面提到的第一种方式,代码不会编译。第17行和第35行中的“行”和“列”必须分别更改为“行”和“列”。
void func_vla(int array[rows][cols],int rows,int cols)
应为
void func_vla(int行、int列、int数组[行][cols])
@KZcoding:17行和35行中使用的VLA符号是正确的,如果编译器支持C99,或者如果它支持C11,并且没有定义
\uuu STDC\u NO\uvla\uzcode>。如果编译器不支持VLA,那么它当然不会编译。malloc返回一个空指针,您确定不需要根据需要将其转换为int*或int**ED?解决方案2C铸造更像是C++约定,得到了!谢谢@ BaltvnEngEnSnEnAUAN很少的查询:如果我们调用函数“<代码> FUNC(2, 3,矩阵)< /代码>,那么我们应该有<代码> Vo.FUNC(int行,int COL,int **矩阵)< /Calk>您的代码需要从代码< INT*[ 3 ]中隐式转换
int**
,这对于大多数C/C++编译器来说可能是不允许的。@jwpol不幸的是,这不是一个好主意:@David Ranieri如果你知道数组的维数,我看不出有什么理由不应该取消引用某个特定元素。例如
int matrix[2][2]
,占用了4个内存单元,因此从
*(p)
*(p+3)
(其中p是第一个元素的地址)在已分配内存的维度内。与此答案相同。您发布的线程是关于在数组中最后一个元素之后取消引用一个元素,这里不是这种情况。如果您在
raw
col
中通过合法边界,@Minhas Kamal提供的答案是绝对安全的。
int sum(int array[][B][C], int A)
{

}
int sum(int array[][B][C][D], int A)
{

}
int sum(int ar[][B][C][D][E][F].....[N], int A)
{

}
#include <stdio.h>

void func(int row, int col, int* matrix){
    int i, j;
    for(i=0; i<row; i++){
        for(j=0; j<col; j++){
            printf("%d ", *(matrix + i*col + j)); // or better: printf("%d ", *matrix++);
        }
        printf("\n");
    }
}

int main(){
    int matrix[2][3] = { {0, 1, 2}, {3, 4, 5} };
    func(2, 3, matrix[0]);

    return 0;
}