有很多友友们不知道写一个实现对应功能需求的函数需要传参时到底是传值还是传址呢?
首先给大家简单解释一下函数的概念:函数是具有相对独立性,是用于实现某项功能,由一个或多个语句块组成。函数有函数名,返回值类型和函数参数。今天主要跟大家讲讲函数参数方面。
给大家举两个例子方便加深理解:
函数一(功能要求:求两个数的最大值。)
#includeint getMax(int x, int y) { return x > y ? x : y; } int main() { int x = 0, y = 0; scanf("%d%d", &x, &y); int result=getMax(x, y); printf("%d", result); return 0; }
运行结果如下:
这里在主函数main中传入参数x,y为实参,而在getMax函数()括号内为形参。
为什么求两个数最大值不用传实参地址呢?原因很简单,因为形参为实参的临时拷贝,在函数调用时创建,函数调用结束后销毁。求两个数最大值不用修改原本的实参,只需要输出两个数中较大值就好了。getMax函数结束后,实参x还是6,实参y还是7,你输入的x,y是多少,函数结束后一样不变。接下来我们看看下一个例子:
函数二(功能要求:将两个数进行交换)
#includevoid Swap(int x,int y) { int temp = x; x = y; y = temp; } int main() { int x = 0, y = 0; scanf("%d %d", &x, &y); printf("交换前:%d %dn", x, y); Swap(x, y); printf("交换后:%d %dn", x, y); return 0; }
为什么交换后x还是10,y还是20?所以这里肯定有一些问题
接下来我们试着调试一下按住F5进行开始调试,也可直接点击调试->开始执行,打开监视窗口
Swap函数执行前,x,y的值及其地址
Swap函数执行时,x,y的值及其地址
从Swap函数执行变化可知,形参与实参的地址是不一样的,由此我们可以进一步得知,改变形参的值是不会改变实参的值的。在Swap函数调用结束后,实参x,y的值是需要交换变化的,所以这里Swap函数中函数参数应该传入实参x,y的地址才可以真正改变x,y的值。根据这个思路我们试试传址是否可行。
#includevoid Swap(int* x,int* y) { int temp = *x; *x = *y; *y = temp; } int main() { int x = 0, y = 0; scanf("%d %d", &x, &y); printf("交换前:%d %dn", x, y); Swap(&x, &y); printf("交换后:%d %dn", x, y); return 0; }
运行结果如下:
成功交换实参x,y的值,所以我们根据调试得出的结论是正确的。
最后,我们来小结一下:
1.形参为实参的临时拷贝,在函数调用时创建,函数调用结束后销毁
2.改变形参的值,并不会影响实参的值
3.当执行某个函数后对应实参值需改变时我们传地址,不需要改变原本实参值时我们就可以传值啦!!!



