编写带参数无返回值的C函数出错:输入浮点数为何输出0.00000?
问题分析与修复方案
嘿,这个问题我太熟了——你踩了C语言值传递的经典坑!输出0.00000的原因很简单:你写的get_numbers函数根本没修改到你原本的变量,它改的只是函数内部的临时副本而已。
具体来说:
- C语言里函数参数默认是值传递:当你调用
get_numbers(a, b)时,程序会把a和b的当前值复制一份,传给函数里的形参a和b - 你在函数里用
scanf修改的是这份临时副本,等函数执行完,副本就被销毁了,主函数里的原变量从头到尾都是初始的0值,输出当然就是0.00000了
最直接的修复:用指针传递变量地址
要让函数能修改外部的变量,你得把变量的内存地址传给函数(也就是用指针),这样函数就能直接操作原变量的存储空间。修改后的代码如下:
#include <stdio.h> // 把函数参数改成指针类型 void get_numbers(float *a, float *b); void get_numbers(float *a, float *b) { printf("Enter the first number: "); // 直接用指针指向的地址存输入值,scanf需要的就是变量地址 scanf("%f", a); printf("Enter the second number: "); scanf("%f", b); } // 主函数调用示例 int main() { float num1, num2; // 传递变量的地址(用&取地址符) get_numbers(&num1, &num2); printf("First number: %f\nSecond number: %f\n", num1, num2); return 0; }
为什么这样就对了?
&num1和&num2拿到的是这两个变量在内存里的地址,把它们传给函数的指针参数a和bscanf("%f", a)会把用户输入的数值直接写到这个地址对应的内存位置,也就是你主函数里num1和num2的存储空间,这样原变量就被正确修改了
其他可选思路
如果你对指针不太习惯,也可以把两个数值封装成一个结构体,让函数返回这个结构体。不过指针是处理这类“函数修改外部变量”问题最常用、最高效的方式,建议好好掌握~
内容的提问来源于stack exchange,提问作者Supakorn Srisawat
相关产品推荐
相关产品推荐

