【发布时间】:2017-03-21 03:04:11
【问题描述】:
我是 C 的新手,所以请多多包涵 :) 我正在尝试学习这门语言,但在尝试更改同一结构的元素时遇到了麻烦。
考虑以下代码:
#include <stdio.h>
struct aStruct{
int someNum;
};//end wordGuessResources struct
int updateSomeNumber(struct aStruct thing){
printf("\nBefore updating someNum is %d.", thing.someNum);
thing.someNum++;
printf("\nAfter updating someNum is %d.", thing.someNum);
return 0;
}
int main(){
struct aStruct thing;
thing.someNum = 2;
updateSomeNumber(thing);
printf("\nIn main, someNum is now %d.", thing.someNum);
updateSomeNumber(thing);
printf("\nIn main, someNum is now %d.", thing.someNum);
return 0;
}//end main
运行此代码将产生输出:
Before updating someNum is 2.
After updating someNum is 3.
In main, someNum is now 2.
Before updating someNum is 2.
After updating someNum is 3.
In main, someNum is now 2.
很明显,当我第一次将thing 传递给updateSomeNumber 时,它正在接受thing 的相同副本,因为它已经知道someNum 是2(见输出的第一行)。
但似乎正在发生的是,在它影响thing 的值之后,当我们返回main 函数时,似乎没有记录任何更改(因为在main 中someNum仍然是 2,而不是 3)。
所以我推测updateSomeNumber 一定是在获取最初在 main 中编辑的thing 的副本,但没有修改原始实例?
如果确实如此,我如何将main 使用的thing 的确切实例传递给函数,以便影响该实例?
【问题讨论】:
-
结构是传值的;
main()中的结构副本被传递给函数。函数修改副本;它不会也不会影响main()中的原件。您需要将指向结构的指针传递给函数,以便修改原始结构。有相应的符号变化(.到->等)。 -
在
main,做updateSomeNumber(&thing);。然后,将 fnc 的定义更改为:int updateSomeNumber(struct aStruct *thing)。然后,在 fnc 中,thing.-->thing->当传递struct时,几乎所有代码都围绕指针传递。由于您遇到的原因,因此几乎从未使用过按值传递。如果您的结构有 50 个不同的项,并且通过值传递,则它们都必须被压入堆栈,从而使代码变慢。 -
@CraigEstey 好的,完美!这就说得通了。我现在看到了,所以我将结构的地址传递给函数,然后在编辑它们时只使用引用函数中值的指针。我现在明白了,谢谢!
-
我确实为我在问题中所做的任何错误而导致投票失败表示歉意。有人可以向我解释我做错了什么,以便我修复它吗?