#include <stdio.h>
int *exchange(int one, int another);
void fun();
void realExchange(int *, int *);
void realExchange(int *one, int *another) {
inttmp;
tmp= *one; // 将one所指向的空间的值,赋值给tmp空间!
*one= *another; // 将another所指向的空间的值,赋值给one所指向的空间
*another= tmp; // 将tmp空间的值,赋值给another所指向的空间!
// tmp= num1;
// num1= num2;
// num2= tmp;
}
void fun() {
intarr[10];
inti;
for(i= 0; i < 10; i++) {
arr[i]= 100;
}
}
int *exchange(int one, int another) {
inttmp;
printf("exchange():%p\n",&tmp);
tmp= one;
one= another;
another= tmp;
printf("exchange():tmp=%d\n",tmp);
return&tmp;
}
int main() {
intnum1;
intnum2;
int*p;
printf("请输入两个数:");
scanf("%d%d",&num1, &num2);
p =exchange(num1, num2);
printf("main():%p\n",p);
printf("交换结果:%d %d\n", num1, num2);
// void realExchange(int *, int *);
realExchange(&num1,&num2);
printf("交换结果:%d %d\n", num1, num2);
printf("%d\n",*p);
return0;
}
在上述代码中,exchange函数并没有真正交换两个变量的值。实参变量空间和形参变量空间不是同一块空间,虽然在函数中交换了形参变量one 和another 的值,但实参num1和num2 值并没有发生任何变化!
从堆栈知识解析realexchange函数,
主函数的申请的两个变量num1和num2,(从右向左入栈)先取出num2变量的首地址值入栈(push),再取出num1变量的首地址值入栈 (从系统角度来看,从头到尾只有一个堆栈,包括线程,进程),先保护住栈底指针,再将栈底指针移到栈顶指针位置上,
(汇编文件)
形参入栈后,栈顶指针向上走两个四字节(减去8B,向内存变小的方向移动),两个形参变量在栈底指针的上边。完成之后栈顶指针再向上走4B(temp), 并完成交换。但指针返回到原来形参变量(temp)时,向下移动8B,这8B这就是返回时的“现场信息”!
然后结果返回主函数,调用结束。