今天想到一个问题,就是 struct 的传参和数组的传参的区别,先看代码
#include <stdio.h> #include <string.h> struct d { int n; char str[100]; }; void chg(struct d *a) { a->n = 1; strcpy(a->str, "changing"); printf("%dn", a->n); printf("%sn", a->str); } void chg_arr(char str[]) { strcpy(str, "changing arr"); printf("%sn", str); } int main() { struct d a; a.n = 2; strcpy(a.str, "before change"); printf("%dn", a.n); printf("%sn", a.str); chg(&a); strcpy(a.str, "after change"); printf("%dn", a.n); printf("%sn", a.str); char str[100] = "before arr change"; printf("%sn", str); chg_arr(str); printf("%sn", str); return 0; }
输出如下
2 before change 1 changing 1 after change before arr change changing arr changing arr
数组传参那段好理解,实参进入函数退化成指针,指向同一片内存,所以自然就改变了内容,但是 struct 那段有点意思,包在结构体里面的数组,在传参的时候却是被复制了一份,这其实意味着在某些场合可以把数组包在结构体里面传来传去吧
=========================================
2012-10-07 15:39:00 uodate 上面的代码贴错了,在 lan 同学的指正下,修改如下
#include <stdio.h> #include <string.h> struct d { int n; char str[100]; }; void chg(struct d a) { a.n = 1; strcpy(a.str, "changing"); printf("%dn", a.n); printf("%sn", a.str); } void chg_arr(char str[]) { strcpy(str, "changing arr"); printf("%sn", str); } int main() { struct d a; a.n = 2; strcpy(a.str, "before change"); printf("%dn", a.n); printf("%sn", a.str); chg(a); strcpy(a.str, "after change"); printf("%dn", a.n); printf("%sn", a.str); char str[100] = "before arr change"; printf("%sn", str); chg_arr(str); printf("%sn", str); return 0; }
输出
2 before change 1 changing 2 after change before arr change changing arr changing arr
这个才是达到了传一个结构体会在传参的时候复制一份的效果
那个结构体里的数组没复制一份啊。三次打印不一样是因为你复值过三次啊。如果结构体传值的话,倒是可以复制一份数组的
嗯嗯,修改过来了,之前测试完传值之后又试了一下传指针,结果最后就把传指针的代码贴上来,贴串了。。囧。。