今天碰到一个问题,程序需要修改结构体内成员的值
代码如下:
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.