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
相关产品推荐
相关产品推荐

