You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言函数中修改结构体的成员变量值?

搞定结构体修改的问题啦!

先给你捋清楚你代码里的两个坑:

  1. 值传递白忙活:你现在的lessHp函数是把整个结构体传进去,相当于复制了一个一模一样的副本在函数里用——你改的只是这个副本的hp,主函数里的原结构体根本没被碰着,所以最后输出还是1,这很正常。
  2. 语法报错的地方:(*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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:28:07