用函数实现交换两个变量的内容,对于该问题我们该如何实现呢?在这里我就用整型变量来说明。
题目:写一个函数可以交换两个整形变量的内容。
我们先来看看如下代码:
#include <stdio.h>
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
printf("交换前:%d %d\n", a, b);
swap(a, b);
printf("交换后:%d %d\n", a, b);
return 0;
}
相信有很多人会认为这就是正确代码,但其实这个代码并不能实现我们想要的结果,也就是我们写的这个 void Swap(int x, int y) 函数并不能实现真正的交换。
其运行结果如下:
显然可以看出交换前后输出结果一样,为什么呢?
因为这时对Swap函数只是传值调用,这里并不实现真正的交换,当实参传给形参的时候,形参只是对实参的一份临时拷贝,对形参的修改不会影响实参。
在这里再说明一下函数的参数:
- 实际参数(实参)
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
- 形式参数(形参)
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
那么对于该题我们就要用传址调用了。正确代码如下:
#include<stdio.h>
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
printf("交换前:%d %d\n", a, b);
swap(&a, &b);//传址调用
printf("交换后:%d %d\n", a, b);
return 0;
}
其运行结果如下:
这时用传址调用就实现了交换,传址调用时对形参的修改就相当于对实参的修改。
总结:
- 传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。当实参传给形参的时候,形参只是对实参的一份临时拷贝。
- 传址调用:把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。