如何在C中将二维数组作为函数的参数传递?

时间:2018-09-16 04:08:23

标签: arrays function pointers

代码:

#include <stdio.h>

char* input(char* arr,int N, int M){
    int i, j;
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            scanf("%d",&arr[i][j]); 
        }   
    }
    return arr;
}

int main() {
    int i,N,M;    
    scanf("%d%d",&N,&M);
    char arr[N][M];
    arr=input(arr,N,M);
    return 0;
}

说明:

上面给出的是一个简单的程序,用户可以将数据输入到二维数组中。

在这里,我尝试将值分配给arr指针(指向基地址);我们从输入函数获得的地址,该地址现在与填充元素的数组相同。我们已经将指针指向输入函数中的数组作为一个参数,并将数组维作为另一个参数。

主要是这里面临的问题是关于指针及其在数组中的应用。但是我无法弄清楚如何进行更改

3 个答案:

答案 0 :(得分:0)

您可以将二维数组的杰作用作参数或参数,可以在调用的函数中定义参数组时指定所有尺寸的大小,也可以省略第一尺寸的大小描述,例如为:

void Func(int array[3][10]);
void Func(int array[][10]);

答案 1 :(得分:0)

有两种方法可以将2D数组作为函数参数传递。

nameChangeHandler = (event, id) => {
    const personIndex = this.state.persons.findIndex(p => p.id === id);
    const newPersons = [...this.state.persons];
    
    newPersons[personIndex].name = event.target.value;
  
    console.log(newPersons);
    console.log(this.state.persons);
    //this.setState({});
};

您将按照在代码中执行的方式读取/写入值。请记住,这是char *input (char [][m]arr, int n, int m) 中引入的功能,不会与较早的编译器一起编译。

另一种选择是将其作为指针传递:

C99

您将在此处读取或写入数组,如下所示:

char *input (char *arr, int n, int m)

C语言中的多维数组逐行存储在内存中。因此,如果您分配了3 x 2的数组,则将有3行,每行有2列。但是内存布局将是:

0,1 =>第1行

2,3 =>第2行

4,5 =>第3行

这里,0、1、2、3、4、5是数组的连续索引。为了访问第三行的第二列,给定指向数组基地址的指针int i, j; for(i=0; i<N; i++){ for(j=0; j<M; j++){ *(arr + i * n + j) = 'a'; /* OR you can also do this */ arr[i *n + j] = 'a'; } } ,您必须在数组中找到正确单元格的地址。

我们知道每一行都有2个单元格,因此为了跳到第三行,我们需要向基本指针添加arr。因此,要进入第三行,我们需要做row_id * number_of_cols_per_row。一旦进入正确的行,我们需要添加要访问的列的列偏移量。所以在这里我们要访问第二列,所以我们添加1。

arr + 2 * 2

但这将是第三行第二列的地址。为了在这里写,我们需要使用arr + 2 * 2 + 1运算符:

*

这正是我们在循环中所做的。

顺便说一句,在您的代码中,您正在使用*(arr + 2 * 2 + 1) = 'a'; 格式说明符调用scanf,该说明符用于整数。但是,您将值存储在char数组中。这可能是潜在的错误,正确的做法是使用%d说明符。

答案 2 :(得分:0)

这是一个可行的完整解决方案:

#include <stdio.h>

void input(int N, int M, char arr[N][M]){
    int i, j;
    for(i=0; i<N; i++){
        for(j=0; j<M; j++){
            scanf("%c", &arr[i][j]);
        }
    }
}

int main() {
    int N, M;
    scanf("%d %d", &N, &M);
    char arr[N][M];
    input(N, M, arr);
    return 0;
}