首先我们要明白以下几点:

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。因此,我们交换形参,做到了交换主调函数中的变量。

相关文章: