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语言)_C_Parameters_Struct - Fatal编程技术网

无法更改结构值(c语言)

无法更改结构值(c语言),c,parameters,struct,C,Parameters,Struct,我写了一段c代码: struct Res { int a; float b; double c; }; struct Res ModRes(struct Res rrr) { rrr.a=222; return rrr; } int main() { struct Res r[10]={1,2,3}; ModRes(r[0]); return 0; } 为什么r[0]在ModRes之后不是222?结构按值传递(复制)到ModR

我写了一段c代码:

struct Res {
    int a;
    float b;
    double c;
};

struct Res ModRes(struct Res rrr)
{
    rrr.a=222;
    return rrr;
}

int main()
{
    struct Res r[10]={1,2,3};
    ModRes(r[0]);
    return 0;
}

为什么
r[0]
ModRes
之后不是222?

结构按值传递(复制)到
ModRes
函数。因此原始值不会更改。

结构将按值传递(复制)到
ModRes
函数。因此原始值不会更改。

因为您正在修改函数作为参数接收的本地副本。研究指针。

因为您正在修改函数作为参数接收的本地副本。研究指针。

在C中,参数是按值传递的。您可以使函数接受
struct Res*
而不是
struct Res

struct Res *ModRes(struct Res *rrr)
{
    rrr->a=222;
    return rrr;
}

int main()
{
    struct Res r[10]={1,2,3};
    ModRes(&r[0]);
    return 0;
}

在C语言中,参数是按值传递的。您可以使函数接受
struct Res*
而不是
struct Res

struct Res *ModRes(struct Res *rrr)
{
    rrr->a=222;
    return rrr;
}

int main()
{
    struct Res r[10]={1,2,3};
    ModRes(&r[0]);
    return 0;
}
您将ModRes()声明为一个函数,该函数通过值接受Res类型的结构,然后返回Res类型的结构。但是,当您从Main()调用ModRes()时,您向它传递了Res类型的结构,但没有处理ModRes()返回的结果。所以,r[0]。a没有改变。您需要将呼叫更改为:

r[0] = ModRes( r[0] );
使您的代码正常工作

然而,正如其他回复帖子所指出的,有一个更好的方法来实现你的目标。您需要更改ModRes,以便它可以通过引用而不是通过值接受其参数;也就是说,您需要向ModRes传递一个指向r[0]结构的指针。您的代码应该是:

void ModRes(struct Res *rrr);   // function prototype

void ModRes(struct Res *rrr)    // function definition
{ 
    rrr->a=222; 
} 
然后,在Main()中:

使用此方法生成的程序字节数通常远小于按值传递参数的字节数。此方法只需将一个参数传递给ModRes:结构的地址。ModRes然后通过该地址修改调用方的结构。它不返回任何内容,因为已经进行了修改

另一种方法将结构的所有内容复制到临时存储器(通常是堆栈),并调用ModRes,然后修改该副本的元素a,将其更改为222。然后,ModRes将该副本(或该副本的副本,具体取决于编译器)复制到临时存储器(通常是堆栈)并返回给调用者,调用者随后将该结构从堆栈复制回调用者的r[0]结构。

您声明ModRes()是一个函数,它通过值接受Res类型的结构,然后返回Res类型的结构。但是,当您从Main()调用ModRes()时,您向它传递了Res类型的结构,但没有对ModRes()返回的结果执行任何操作。所以,r[0]。a没有改变。您需要将呼叫更改为:

r[0] = ModRes( r[0] );
使您的代码正常工作

然而,正如其他回复帖子所指出的,有一个更好的方法来实现你的目标。您需要更改ModRes,以便它可以通过引用而不是通过值接受其参数;也就是说,您需要向ModRes传递一个指向r[0]结构的指针。您的代码应该是:

void ModRes(struct Res *rrr);   // function prototype

void ModRes(struct Res *rrr)    // function definition
{ 
    rrr->a=222; 
} 
然后,在Main()中:

使用此方法生成的程序字节数通常远小于按值传递参数的字节数。此方法只需将一个参数传递给ModRes:结构的地址。ModRes然后通过该地址修改调用方的结构。它不返回任何内容,因为已经进行了修改

另一种方法将结构的所有内容复制到临时存储器(通常是堆栈),并调用ModRes,然后修改该副本的元素a,将其更改为222。然后,ModRes将该副本(或该副本的副本,具体取决于编译器)复制到临时存储器(通常是堆栈)并返回给调用者,调用者随后将该结构从堆栈复制回调用者的r[0]结构