首先错误的方法:
#include<stdio.h>
void exchange(int, int);
void exchange(int one, int another)
{
int tmp;
tmp = one;
one = anthoner;
another = tmp;
}
int main()
{
int num1;
int num2;
scanf('%d %d', &num1,&num2);
exchange(num1, num2);
printf('交换后:%d %d', num1, num2);
return 0;
}
因为函数只是对其内的局部变量进行了值的交换,而没有真正的对num1,num2进行值的交换,实质上是函数调用栈顶指针上移,函数调用完之后栈顶指针回落,并没有对num1,num2在栈所占的位置操作。
接下来正确的方法是:
#include<stdio.h>
void exchange(int *, int *);
void exchange(int *one, int *another)
{
int tmp;
tmp =*one;
*one = *anthoner;
*another = tmp;
}
int main()
{
int num1;
int num2;
scanf('%d %d', &num1,&num2);
exchange(&num1, &num2);
printf('交换后:%d %d', num1, num2);
return 0;
}
把函数形参变量的数据类型换成int *,实参换成num1和num2的首地址后,函数调用时就变成了:把num1和num2所在内存空间的首地址赋值给one和another两个指针变量,然后函数内对one,another的改变就是对实参num1,num2的改变!
过程:把one所指向的空间的值复制一份赋值给tmp,再把another所指向的空间的值赋值给one所指向的空间,最后再把tmp空间的值赋值给another所指向的空间。