形参与实参值传递

形参变量只有在被函数调用的时候才分配内存单元,调用结束后即刻释放所分配的内存单元。

也就是在函数被调用时申请空间,此函数执行完后释放空间。

用如下代码举例

#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;
} 

此时,形参所申请的空间中放的是指向num1和num2的指针,而函数内部操作的控件是形参所指向的空间也就是num1和num2所在的空间,对此空间进行操作,当形参的空间被释放时也不会改变什么。


猜你喜欢

转载自blog.csdn.net/GanesaFallen/article/details/79935800