实现一个计算输入的两数的和与差的简单函数。
首先 我们知道一般从子函数只能向主函数中返回一个值,可是本题却要求我们返回和与差,这样我们就无法通过返回值来进行完成,于是我相信很多初学者都会犯如下错误:在子函数中通过值传递的方式计算出加减的结果,让后在主函数中输出,我们先来看一下错误实例:
错误示例
#include<stdio.h>
void sum_diff(float op1, float op2, float psum, float pdiff);
int main()
{
float op1, op2;//被加减的数
float psum=0, pdiff=0;//结果
scanf("%f%f", &op1,&op2);
sum_diff(op1,op2,psum,pdiff);
printf("%f,%f", psum, pdiff);
return 0;
}
void sum_diff(float op1, float op2, float psum, float pdiff)
{
psum = op1 + op2;
pdiff = op1 - op2;
printf("%f,%f ", psum, pdiff);
}
运行结果:
这里首先打印的是子函数中的psum与pdiff,再打印主函数中的psum与pdiff,在这里我们可以看出这俩个函数中的psum与pdiff是不一样的,这是为什么呢?因为值传递这种方式使用变量、常量、数组元素作为函数参数,实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元,这种传递方式称为“参数的值传递”或者“函数的传值调用”。
值传递的特点是单向传递,即主调函数调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。
正确实例
所以在这里我们选用地址传递的方式 通过传递地址来间接访问我们要进行操作的数值。
附上代码
/*本题要求实现一个计算输入的两数的和与差的简单函数。
函数接口定义:
void sum_diff(float op1, float op2, float psum, float pdiff);
其中op1和op2是输入的两个实数,psum和pdiff是计算得出的和与差。
*/
#include<stdio.h>
void sum_diff(float op1, float op2, float *psum, float *pdiff);//op1与op2是从主函数中传下来的值 psum与pdiff分别是俩数相加与相减的值
int main()
{
float op1, op2;//被加减的数
float psum=0, pdiff=0;//结果
scanf("%f%f", &op1,&op2);
sum_diff(op1,op2,&psum,&pdiff);
printf("%f,%f", psum, pdiff);
return 0;
}
void sum_diff(float op1, float op2, float *psum, float *pdiff)//这里op1与op2是形参 在主函数中op1与op2是实参 在我们这个加减函数中不管op1与op2怎么改变也不会影响到主函数中实参op1与op2的值
{ //然而这里我们传的psum与pdiff的地址 可以通过指针访问地址来间接的改变主函数里的实参
*psum = op1 + op2;
*pdiff = op1 - op2;
//printf("%f,%f", psum, pdiff);
}
运行结果
请注意我们再声明函数和调用函数中的形参的样式。
通过如此方式我们就可以完成再子函数中实现加减法,也可以理解实参和形参的概念以及值传递与地址传递的不同。