首先我们要明白以下几点:
1、系统给形参分配的空间就是实参所用的空间(即,形参空间中的值就是实参计算后最终的值);
2、主调函数中,实参的空间和变量的空间是完全不相干(除特殊操作外,比如,将变量的地址赋给实参)的。
下面我们举例(通过形参改变主调函数中的变量)说明:
#include
void exchange(int, int);
void exchange(int one, int anther){
int temp;
temp = one;
one = anther;
anther = temp;
}
int main(){
int num1;
int num2;
num1 = 1;
num2 = 2;
printf("交换前:num1=%d num2=%d\n", num1, num2);
exchange(num1,num2);
printf("交换后:num1=%d num2=%d\n", num1, num2 );
return 0;
}
很明显,交换不成功。举此例,意义在于说明,实参和变量是两个不同的空间,改变实参(也就是我们平时所说的改变形参)不等于改变了变量
上图操作我们可以看出,形参one和another确实交换了实参num1和num2,但却没有对主调函数中的变量num1和num2触及,因此,最终输出的变量num1和num2是没有发生变换的。
#include
void exchange(int*, int*);
void exchange(int *one, int anther*){
int temp;
temp = *one;
*one = *anther;
*anther = *temp;
}
int main(){
int num1;
int num2;
num1 = 1;
num2 = 2;
printf("交换前:num1=%d num2=%d\n", num1, num2);
exchange(&num1,&num2);
printf("交换后:num1=%d num2=%d\n", num1, num2 );
return 0;
}
由上述原理图我们可以看出,这次实参中保存的是变量num1和num2的地址,交换实参(即,交换one和another),最终结果将是one空间中变成了num2的地址,another中变成了num1的地址。对于主调函数中的变量还是没有变化。然而,我没交换的是*one和*another(即,我们交换了one中所存储的地址所指向的值和another中所存储的地址所指向的值),而我们知道,one中存的地址是变量num1的地址,其所指向的值就是变量num1中的值,同理,*another=2。因此,我们交换形参,做到了交换主调函数中的变量。