形参与实参(从系统堆栈的角度理解)

#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 的值,但实参num1num2 值并没有发生任何变化!

从堆栈知识解析realexchange函数,

主函数的申请的两个变量num1num2,(从右向左入栈)先取出num2变量的首地址值入栈(push,再取出num1变量的首地址值入栈 (从系统角度来看,从头到尾只有一个堆栈,包括线程,进程),先保护住栈底指针,再将栈底指针移到栈顶指针位置上,

 

(汇编文件)

形参入栈后,栈顶指针向上走两个四字节(减去8B,向内存变小的方向移动),两个形参变量在栈底指针的上边。完成之后栈顶指针再向上走4Btemp), 并完成交换。但指针返回到原来形参变量(temp)时,向下移动8B,这8B这就是返回时的“现场信息”!

然后结果返回主函数,调用结束。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值