C语言结构体作为形参

今天碰到一个问题,程序需要修改结构体内成员的值
代码如下:

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.

猜你喜欢

转载自blog.csdn.net/weixin_45772041/article/details/108920791