今天碰到一个问题,程序需要修改结构体内成员的值 代码如下:
typedef struct { int n; }St; void a(St L); int main() { St L; L.n=0; printf("%d\n",L.n); a(L); printf("%d",L.n); getchar(); return 0; } void a(St L) { L.n=1; }程序声明一个结构体变量,并在函数中修改成员的值,但并没有生效,两次输出都为零。
问题应该出在函数的值传递与地址传递上,修改后如下:
typedef struct { int n; }St; void a(St *L); int main() { St L; L.n=0; printf("%d\n",L.n); a(&L); printf("%d",L.n); getchar(); return 0; } void a(St *L) { (*L).n=1; }将函数形参和实参修改为按地址传递的方式就可以了
还有个小问题
(*L).n=1;修改后的函数a内赋值必须加括号,点号的优先级比乘号高,不加括号就会发生错误的赋值
*L.n=1; 意思是将L.n这个地址的值修改为1,但此处L.n并不是地址,传入的形参L本就是一个结构体的地址,地址.n就更无从说起了。
(*L).n=1; 加括号后就变成了取L这个地址的值,也就是结构体,将其成员n的值修改为1.