如何在C语言函数中修改结构体的成员变量值?
搞定结构体修改的问题啦!
先给你捋清楚你代码里的两个坑:
- 值传递白忙活:你现在的
lessHp函数是把整个结构体传进去,相当于复制了一个一模一样的副本在函数里用——你改的只是这个副本的hp,主函数里的原结构体根本没被碰着,所以最后输出还是1,这很正常。 - 语法报错的地方:
(*Player)->hp -= 1;这行完全不对,Player是你定义的结构体类型,不是指针变量,不能这么解引用,实际编译这行肯定会报错,你给出的输出应该是假设这行能跑的情况吧😅
要让函数真的能修改原结构体的hp,核心是让函数能直接访问原变量的内存,这里给你两种可行的方法:
方法一:C语言标准方案——指针传参
这是C里最常用的方式,把结构体的地址传给函数,让函数通过指针操作原变量:
#include <stdio.h> typedef struct { int hp; } Player; void lessHp(Player *a) { // 参数改成结构体指针 printf("a->hp = %d\n", a->hp); a->hp -= 1; // 直接通过指针修改原结构体的成员 printf("a->hp now = %d\n", a->hp); } int main() { Player a; a.hp = 1; lessHp(&a); // 传入原变量的地址 printf("a.hp = %d\n", a.hp); return 0; }
运行后的输出就变成了:
a->hp = 1 a->hp now = 0 a.hp = 0
关键说明
Player *a表示函数接收一个指向Player结构体的指针,拿到的是原变量的内存地址。a->hp是指针访问结构体成员的语法,和(*a).hp是一个意思,只是写起来更简洁。- 调用时传
&a,就是把原变量a的地址传给函数,这样函数里的修改就直接作用在原变量上了。
方法二:C的引用传参(如果你用C的话)
你提到尝试引用传参出问题,应该是用了C的编译器?因为标准C语言里没有引用的语法,只有C支持。如果是写C代码,用引用会更直观:
#include <iostream> using namespace std; typedef struct { int hp; } Player; void lessHp(Player &a) { // C++的引用参数 cout << "a.hp = " << a.hp << endl; a.hp -= 1; cout << "a.hp now = " << a.hp << endl; } int main() { Player a; a.hp = 1; lessHp(a); // 直接传变量,引用会绑定到原变量上 cout << "a.hp = " << a.hp << endl; return 0; }
这种方式下,函数里的a就是主函数中a的“别名”,修改它就是修改原变量,不需要用指针和地址符,写法更简洁,但仅限C++环境。
内容的提问来源于stack exchange,提问作者Yoakain
相关产品推荐
相关产品推荐

