无法更改结构值(c语言)
我写了一段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
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]结构