Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中传递函数中的2D数组(矩阵)?_C_Multidimensional Array_Parameter Passing - Fatal编程技术网

如何在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); ... } 我不知道你

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

这够了吗


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

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

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

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

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

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;iC)而言,实际上没有多维数组,但有几种方法可以模拟它们。将此类数组传递给函数的方式取决于用于模拟多维数组的方式:

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)
{

}
二维阵列:

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;i传递可变长度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*)
所有大小信息都会丢失—“计算机”不知道任何事情,编译器也不关心。Random 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++约定,得到了!谢谢BartvanIngenSchenauIn第一个方法,代码不会编译。行17和35中的“行”和“COLS”必须分别更改为“行”和“COLS”。<代码>无效函数VLA(int数组[行] [COLS],int行,int COLs)< /C> >应该是代码>无效函数VLA。(int行、int列、int数组[行][cols])
@KZcoding:17行和35行中使用的VLA符号是正确的,如果编译器支持C99,或者如果它支持C11,并且没有定义
\uuu STDC\u NO\uvla\uzcode>。如果编译器不支持VLA,那么它当然不会编译。malloc返回一个空指针,您确定不需要根据需要将其转换为int*或int**ED?解决方案2C铸造更像是C++约定,得到了!谢谢@ BaltVungEnnSnEnAuAuple很少的查询:如果我们调用函数“<代码> FUNC(2, 3,矩阵)< /CUT>,那么我们应该有<代码> Vo.FUNC(int行,int COL,int **矩阵)< /Cord>?@ Ka