形参变量只有在被函数调用的时候才分配内存单元,调用结束后即刻释放所分配的内存单元。
也就是在函数被调用时申请空间,此函数执行完后释放空间。
用如下代码举例
#include <stdio.h>
void Exchange(int m,int n);
void Exchange(int m, int n) {
int tmp;
tmp = m;
m = n;
n = tmp;
}
int main () {
int num1;
int num2;
printf("请输入两个数:");
scanf("%d%d", &num1,&num2);
Exchange(num1,num2);
printf("交换后的值:");
printf("%d %d",num1,num2);
return 0;
}
执行完之后并未交换,是因为:
函数被调用时形参m和n申请了空间,空间中的值为num1和num2。而后执行的一系列交换操作是对形参所申请的空间中的值进行交换。当函数执行玩后这两个空间被释放,输出的值为主函数中num1和num2所申请的空间中的值,但是此空间并未被改变,所以输出的值是不变的。
所以使用调用函数时应当通过指针来对实参所在的空间进行操作。类似如下代码:
#include <stdio.h>
void Exchange(int *m,int *n);
void Exchange(int *m, int *n) {
int tmp;
tmp = *m;
*m = *n;
*n = tmp;
}
int main () {
int num1;
int num2;
printf("请输入两个数:");
scanf("%d%d", &num1,&num2);
Exchange(&num1,&num2);
printf("交换后的值:");
printf("%d %d",num1,num2);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/b0f45664a52465ebc1d2388bcbb660ce.png)
此时,形参所申请的空间中放的是指向num1和num2的指针,而函数内部操作的控件是形参所指向的空间也就是num1和num2所在的空间,对此空间进行操作,当形参的空间被释放时也不会改变什么。