Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 在二维数组中保存元素_C_Arrays_Multidimensional Array - Fatal编程技术网

C 在二维数组中保存元素

C 在二维数组中保存元素,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,如何在二维数组中保存数字?为什么这个代码不起作用 void input_arr(int *arr, int n, int m); void print_arr(int *arr, int n, int m); int main() { int *arr; int n, m; printf("Insert line of array: "); scanf("%d", &n); printf("Insert column of array: "

如何在二维数组中保存数字?为什么这个代码不起作用

void input_arr(int *arr, int n, int m);

void print_arr(int *arr, int n, int m);

int main()
{
    int *arr;
    int n, m;

    printf("Insert line of array: ");
    scanf("%d", &n);

    printf("Insert column of array: ");
    scanf("%d", &m);

    arr = calloc(n * m, sizeof(int));

    input_arr(arr, n, m);

    return 0;
}

void input_arr(int *arr, int n, int m)
{
    int i;
    int j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("Insert element in line %d and column %d: ", i, j);
            scanf("%d", (&arr[i][j]));
        }
    }
}

void print_arr(int *arr, int n, int m)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("%d ", *arr[i][j]);
        }
    }
}

您需要将数组作为双指针int**数组或更简单的int*数组[]传递

解释 通过将数组作为int*array传递,当您说&array[i]时,您推断的是数组的复制值,而不是原始值。
具体来说,在函数中,当您只想读取或/和打印数组数据时,您可以简单地使用单指针,但如果您想更改它,则必须使用双指针。

您需要将数组作为双指针int**数组或更简单的int*数组[]传递

解释 通过将数组作为int*array传递,当您说&array[i]时,您推断的是数组的复制值,而不是原始值。
具体来说,在函数中,当您只想读取或/和打印数组数据时,您可以简单地使用单指针,但如果您想更改它,则必须使用双指针。

替换函数声明,如下所示:

void input_arr(int *arr[], int n, int m)
void print_arr(int *arr[], int n, int m)
如果对数组元素有scanf和printf调用,请使用以下命令:

scanf("%d", arr + i * m + j);
printf("%d", *(arr + i * m + j));
为了进行良好的练习,当你完成时释放你的记忆。将此项添加到主菜单的末尾:

此外,如果您有C99或更高版本的编译器,您可以使用可变长度数组来完成这项工作,并允许您使用arr[i][j]而不是难看的arr+i*m+j对数组进行索引


替换函数声明,如下所示:

void input_arr(int *arr[], int n, int m)
void print_arr(int *arr[], int n, int m)
如果对数组元素有scanf和printf调用,请使用以下命令:

scanf("%d", arr + i * m + j);
printf("%d", *(arr + i * m + j));
为了进行良好的练习,当你完成时释放你的记忆。将此项添加到主菜单的末尾:

此外,如果您有C99或更高版本的编译器,您可以使用可变长度数组来完成这项工作,并允许您使用arr[i][j]而不是难看的arr+i*m+j对数组进行索引


将指针传递到分配的空间时,该空间会像线性数组一样存储。要执行所需操作,需要使用2D数组或其他可以以相同方式使用的对象,您需要:

用于行的指针数组,并为每一行分配内存。 双指针并分配内存,以模拟行和列的方式存储值。 您还可以使用线性阵列,使输入和输出看起来像一个2D阵列。 也可以只使用普通的二维阵列。 由于您正在使用双指针进行内存分配:

#include <stdio.h>
#include <stdlib.h>

void input_arr(int **arr, int n, int m); //double pointer to int parameter
void print_arr(int **arr, int n, int m); //same

int main() {

    int n, m;
    int **arr; //double pointer for 2D array like memory allocation

    printf("Insert line of array: ");

    if(scanf("%d", &n) != 1 || n < 1) {  //always check input
        puts("positive integer value expected!"); 
        return 1;
    }

    printf("Insert column of array: ");

    if(scanf("%d", &m) != 1 || m < 1) {  //always check input
        puts("positive integer value expected!");
        return 1;
    }

    if(!(arr = malloc(n * sizeof(*arr)))){ //allocate memory lines, check for errors
        perror("Memory allocation failed!");
        return 1;
    }

    for(int i = 0; i < n; i++)
        if(!(arr[i] = malloc(m * sizeof(**arr)))) { //allocate memory for columns, check for errors
            perror("Memory allocation failed");
            return 1;
        }

    input_arr(arr, n, m);
    print_arr(arr, n, m);

    return 0;
}

void input_arr(int **arr, int n, int m) {

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("Insert element in line %d and column %d: ", i, j);
            scanf("%d", &arr[i][j]);
        }
    }
}

void print_arr(int **arr, int n, int m) {

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("%d ", arr[i][j]); //no dereferencing
        }
        putchar('\n');
    }
}

将指针传递到分配的空间时,该空间会像线性数组一样存储。要执行所需操作,需要使用2D数组或其他可以以相同方式使用的对象,您需要:

用于行的指针数组,并为每一行分配内存。 双指针并分配内存,以模拟行和列的方式存储值。 您还可以使用线性阵列,使输入和输出看起来像一个2D阵列。 也可以只使用普通的二维阵列。 由于您正在使用双指针进行内存分配:

#include <stdio.h>
#include <stdlib.h>

void input_arr(int **arr, int n, int m); //double pointer to int parameter
void print_arr(int **arr, int n, int m); //same

int main() {

    int n, m;
    int **arr; //double pointer for 2D array like memory allocation

    printf("Insert line of array: ");

    if(scanf("%d", &n) != 1 || n < 1) {  //always check input
        puts("positive integer value expected!"); 
        return 1;
    }

    printf("Insert column of array: ");

    if(scanf("%d", &m) != 1 || m < 1) {  //always check input
        puts("positive integer value expected!");
        return 1;
    }

    if(!(arr = malloc(n * sizeof(*arr)))){ //allocate memory lines, check for errors
        perror("Memory allocation failed!");
        return 1;
    }

    for(int i = 0; i < n; i++)
        if(!(arr[i] = malloc(m * sizeof(**arr)))) { //allocate memory for columns, check for errors
            perror("Memory allocation failed");
            return 1;
        }

    input_arr(arr, n, m);
    print_arr(arr, n, m);

    return 0;
}

void input_arr(int **arr, int n, int m) {

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("Insert element in line %d and column %d: ", i, j);
            scanf("%d", &arr[i][j]);
        }
    }
}

void print_arr(int **arr, int n, int m) {

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("%d ", arr[i][j]); //no dereferencing
        }
        putchar('\n');
    }
}

代码分配并初始化一个连续的内存块,并将指向int的指针传递给函数。问题是在这些函数中,指针被取消引用的次数太多

void input_arr(int *arr, int n, int m)
{
    // ...
    scanf("%d", (&arr[i][j]));
    //                  ^^^ 
}

void print_arr(int *arr, int n, int m)
{
    // ...
    printf("%d ", *arr[i][j]);
    //            ^      ^^^
}
如果您可以使用可变长度数组,那么与其他答案中已经发布的数组不同的一个选项是在这些函数中声明指向VLA的指针:

void input_arr(int *arr, int n, int m)
{
    // ...
    scanf("%d", arr++);
    //          ^^^ Here you can just access to every element in order 
}

void print_arr(int *arr, int n, int m)
{
    // Declare a pointer to array of m elements
    int (*mat)[m] = (void *)arr;

    // ...
    printf("%d ", mat[i][j]);
    //            ^^^^^^^^^  Use it as if it's a 2D VLA
}

另外,请记住释放main中分配的内存。

代码分配并初始化连续内存块,并将指向int的指针传递给函数。问题是在这些函数中,指针被取消引用的次数太多

void input_arr(int *arr, int n, int m)
{
    // ...
    scanf("%d", (&arr[i][j]));
    //                  ^^^ 
}

void print_arr(int *arr, int n, int m)
{
    // ...
    printf("%d ", *arr[i][j]);
    //            ^      ^^^
}
如果您可以使用可变长度数组,那么与其他答案中已经发布的数组不同的一个选项是在这些函数中声明指向VLA的指针:

void input_arr(int *arr, int n, int m)
{
    // ...
    scanf("%d", arr++);
    //          ^^^ Here you can just access to every element in order 
}

void print_arr(int *arr, int n, int m)
{
    // Declare a pointer to array of m elements
    int (*mat)[m] = (void *)arr;

    // ...
    printf("%d ", mat[i][j]);
    //            ^^^^^^^^^  Use it as if it's a 2D VLA
}
另外,请记住释放main中分配的内存

如何在二维数组中保存数字

例如:

int twoD[2][3];
twoD[1][1] = 42;
为什么这个代码不起作用

void input_arr(int *arr, int n, int m);

void print_arr(int *arr, int n, int m);

int main()
{
    int *arr;
    int n, m;

    printf("Insert line of array: ");
    scanf("%d", &n);

    printf("Insert column of array: ");
    scanf("%d", &m);

    arr = calloc(n * m, sizeof(int));

    input_arr(arr, n, m);

    return 0;
}

void input_arr(int *arr, int n, int m)
{
    int i;
    int j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("Insert element in line %d and column %d: ", i, j);
            scanf("%d", (&arr[i][j]));
        }
    }
}

void print_arr(int *arr, int n, int m)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("%d ", *arr[i][j]);
        }
    }
}
OP的代码没有使用2D数组,而是使用指向int的指针,然后错误地使用了该指针

int *arr;
// Allocate memory for a 1-D array of  n*m `int` 
arr = calloc(n * m, sizeof(int));
函数代码尝试取消引用int

这里,arr[i]是一个int。arr[i][j]毫无意义

要分配内存,您需要一个指针,但它是什么类型的

是否需要指向下面2D数组的指针, 指向int[m]数组的指针 还是指向指向int的指针数组的指针

或者以类似2D的方式使用当前代码,并使用计算出的索引访问1D数组分配

// scanf("%d", (&arr[i][j]));
scanf("%d", &arr[i*m + j]);

// printf("%d ", *arr[i][j]);
printf("%d ", arr[i*m + j]);
如何在二维数组中保存数字

例如:

int twoD[2][3];
twoD[1][1] = 42;
为什么这个代码不起作用

void input_arr(int *arr, int n, int m);

void print_arr(int *arr, int n, int m);

int main()
{
    int *arr;
    int n, m;

    printf("Insert line of array: ");
    scanf("%d", &n);

    printf("Insert column of array: ");
    scanf("%d", &m);

    arr = calloc(n * m, sizeof(int));

    input_arr(arr, n, m);

    return 0;
}

void input_arr(int *arr, int n, int m)
{
    int i;
    int j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("Insert element in line %d and column %d: ", i, j);
            scanf("%d", (&arr[i][j]));
        }
    }
}

void print_arr(int *arr, int n, int m)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("%d ", *arr[i][j]);
        }
    }
}
OP的代码没有使用2D数组,而是使用指向int的指针,然后错误地使用了该指针

int *arr;
// Allocate memory for a 1-D array of  n*m `int` 
arr = calloc(n * m, sizeof(int));
函数代码尝试取消引用int

这里,arr[i]是一个int。arr[i][j]毫无意义

要分配内存,您需要一个指针,但它是什么类型的

是否需要指向下面2D数组的指针, 指向int[m]数组的指针 还是指向指向int的指针数组的指针

或 以类似2D的方式使用当前代码,并使用计算出的索引访问1D数组分配

// scanf("%d", (&arr[i][j]));
scanf("%d", &arr[i*m + j]);

// printf("%d ", *arr[i][j]);
printf("%d ", arr[i*m + j]);


请显示调用该函数的代码。这是因为int*arr不是一种表示2D数组的类型,甚至不是一种表现为2D数组的类型。您实际上是在向函数传递2D数组吗?请提供一份报告。另外,请定义不工作-编译错误?崩溃不正确的值?什么?@Boninsimo对我来说,这个功能很有效!:您似乎没有正确地使用该函数。@VladFrommos该函数无法工作,至少不能以定义的行为工作。他在单级指针上使用双索引[i][j]。@DarkAtom和什么?他可以对这样的数组使用操作符。没问题!请显示调用该函数的代码。这是因为int*arr不是一种表示2D数组的类型,甚至不是一种表现为2D数组的类型。您实际上是在向函数传递2D数组吗?请提供一份报告。另外,请定义不工作-编译错误?崩溃不正确的值?什么?@Boninsimo对我来说,这个功能很有效!:您似乎没有正确地使用该函数。@VladFrommos该函数无法工作,至少不能以定义的行为工作。他在单级指针上使用双索引[i][j]。@DarkAtom和什么?他可以对这样的数组使用操作符。没问题!这是可行的,但是调用方代码可能也需要根据数组的声明方式进行修改。是的,这是正确的,尽管没有办法解决,但是您的解释是错误的。需要双指针的原因是因为它是一个双向数组。函数始终可以修改调用方数组的内容,除非它是常量参数,因为数组是通过其地址传递的。这将起作用,但调用方代码可能也需要根据数组的声明方式进行修改。是的,这是正确的,尽管没有办法解决此问题。但是,您的解释是错误的。需要双指针的原因是因为它是一个双向数组。函数总是可以修改调用者数组的内容,除非它是常量参数,因为数组是通过它的地址传递的。这可能是OP想要/需要的,但是char**arr不是2D数组。当然@Boninissimo,所以在arr=mallocn*sizeof*arr中,我正在为指针数组分配内存,如果你愿意的话,这些指针中的每一个都将指向每一行的行距,然后在forint i=0中;i