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

C语言简易银行系统余额不更新:能否不使用指针与->运算符?

不用->运算符解决C语言结构体余额不更新的方案

在你的银行系统里,存款后余额不更新的核心原因是传值调用会创建结构体副本,修改副本不会影响原结构体。不用->运算符的话,有两种可行的解决思路:

1. 传指针配合解引用(*)和.运算符

虽然还是要传指针,但可以用(*指针变量).成员的写法替代指针变量->成员——这两种写法是完全等价的,->只是C语言提供的语法糖。

示例代码:

#include <stdio.h>

typedef struct {
    int id;
    float balance;
} account;

// 存款函数:传结构体指针,用解引用+ . 操作成员
void deposit(account *acc_ptr, float amount) {
    if (amount > 0) {
        (*acc_ptr).balance += amount;
        printf("存款成功,当前余额:%.2f\n", (*acc_ptr).balance);
    }
}

int main() {
    account my_acc = {1001, 500.0};
    deposit(&my_acc, 200.0); // 传原结构体的地址
    printf("主函数中余额:%.2f\n", my_acc.balance); // 输出700.0,原结构体已更新
    return 0;
}

这里通过指针指向原结构体的内存地址,解引用后直接操作原成员,避免了副本问题。

2. 值传递+返回修改后的结构体

这种方式完全不用指针,函数接收结构体副本,修改后返回新的结构体,再赋值给原变量。适合结构体体积较小的场景(比如你的银行账户结构体),但如果结构体很大,值拷贝会带来性能损耗。

示例代码:

#include <stdio.h>

typedef struct {
    int id;
    float balance;
} account;

// 存款函数:值传递,返回修改后的结构体
account deposit(account acc, float amount) {
    if (amount > 0) {
        acc.balance += amount;
        printf("存款成功,当前余额:%.2f\n", acc.balance);
    }
    return acc;
}

int main() {
    account my_acc = {1001, 500.0};
    my_acc = deposit(my_acc, 200.0); // 接收返回值,覆盖原变量
    printf("主函数中余额:%.2f\n", my_acc.balance); // 输出700.0,原结构体已更新
    return 0;
}

这种方式的关键是必须将函数返回的结构体重新赋值给原变量,否则原变量不会被更新。

总结

  • 第一种方案和用->的逻辑完全一致,只是写法不同,是最推荐的方式(没有性能损耗,逻辑清晰)。
  • 第二种方案适合简单场景,但要注意结构体拷贝的开销问题。

内容的提问来源于stack exchange,提问作者Healing_Salve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:06:01