【问题标题】:Why does the matrix in main change? [duplicate]为什么 main 中的矩阵会发生变化? [复制]
【发布时间】:2020-09-30 19:47:35
【问题描述】:

我正在学习 C,我很困惑为什么函数中的主要变化中的矩阵会发生变化。我假设矩阵在函数 change 中作为 ma[10][10] 传递,并且矩阵 m 不应该改变,因为我在 main 中声明了它,对吗?有人可以解释在这种情况下发生了什么吗?我该如何解决?

谢谢帮助

void change(int ma[2][3]){
    int l, c;
    for(l=0; l<2; l++){
        for(c=0; c<3; c++){
            ma[l][c]=1;
        }
    }
}
int main()
{
    int m[2][3], l, c;
    for(l=0; l<2; l++){
        for(c=0; c<3; c++){
            m[l][c]=0;
        }
    }
    change(m);
    for(l=0; l<2; l++){
        for(c=0; c<3; c++){
            printf("%d", m[l][c]);
        }
        printf("\n");
    }
    return 0;
}

我期待看到这个:

000
000

我得到了什么:

111
111

【问题讨论】:

标签: c arrays function parameter-passing


【解决方案1】:
void change(int ma[2][3]){ ...
......
int m[2][3];
change(m);

main中的矩阵为什么会发生变化?

您通过引用函数change 来传递数组m

参数int ma[2][3]其实并不是一个数组,它是一个int (*)[3]类型的指针,会指向main()m的第一个元素的地址。

这就是为什么 main 中的 m 发生了变化。

我该如何解决?

C 不允许按值向函数传递或返回数组。

但是,有一些解决方法。你可以将数组包装成一个结构,然后访问结构内部的数组。可以按值传递和返回的结构。

#include <stdio.h>

#define ROWS 2
#define COLS 3

struct x {
    int m[ROWS][COLS];
};

static void no_change (struct x b) 
{
    int l, c;
    for ( l = 0; l < ROWS; l++) {
        for ( c = 0; c < COLS; c++ ) {
            b.m[l][c] = 1;
        }
    }
}

int main (void)
{
    int l, c;
    struct x a;

    for ( l = 0; l < ROWS; l++ ) {
        for ( c = 0; c < COLS; c++ ) {
            a.m[l][c] = 0;
        }
    }

    no_change(a);

    for ( l = 0; l < ROWS; l++ ) {
        for ( c = 0; c < COLS; c++ ) {
            printf("%d", a.m[l][c]);
        }
        printf("\n");
    }
    return 0;
}

输出:

000
000

【讨论】:

    【解决方案2】:

    因为数组是通过指针而不是值传递的。

    所以你在同一个数组上工作。

    在 C 中,只有标量类型、结构和联合是按值传递的

    我该如何解决?

    你无法修复它。如果你真的想通过值传递数组,你需要将它包装到结构中

    typedef struct
    {
        int arr[2][3]
    }ARR_WRAP;
    
    void change(ARR_WRAP ma)
    {
        int l, c;
        for(l=0; l<2; l++)
        {
            for(c=0; c<3; c++)
            {
                ma.arr[l][c]=1;
            }
        }
    }
    
    int main()
    {
        ARR_WRAP m;
        for(int l=0; l<2; l++)
        {
            for(int c=0; c<3; c++)
            {
                m.arr[l][c]=0;
            }
        }
        change(m);
        for(int l=0; l<2; l++)
        {
            for(int c=0; c<3; c++)
            {
                printf("%d", m.arr[l][c]);
            }
            printf("\n");
        }
        return 0;
    }
    

    【讨论】:

    • 我该如何解决?
    猜你喜欢
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多