#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指针(指向基地址);我们从输入函数获得的地址,该地址现在与填充元素的数组相同。我们已经将指针指向输入函数中的数组作为一个参数,并将数组维作为另一个参数。
主要是这里面临的问题是关于指针及其在数组中的应用。但是我无法弄清楚如何进行更改
答案 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;
}