分析传递指针的指针

   很多人都应该记得一道很经典的C的面试题:

  

   看到这个题目大家都应该知道答案,并能说出理由是:在传递过程中参数会在栈上做一个复制品,在函数体内进行操作的是这个复制品。这也就时我们为什么在休要修改一个变量值是要传递指针的原因了。如图所示:

    我们这时操作的是arga这个变量的值,而不是a的值。如果传入指针,同样是有一个复制,但是是我们的目标操作对象不是指针本身而是指针指向的堆上的一个区域。这是操作这个值是没有问题的,但是如果我们要修改指针指向的位置,也就是说要重新给指针赋值,那样的话传递指针就不可能实现了。解决方案是传递指针的指针,这样复制品中存储的是指针本身的地址,修改这个复制品指针指向的值也就是修改原来指针中存储的地址。

    如此我们在理论上了解的问题产生的原因和解决的方案。但我有这样的疑问为什么会产生复制呢?

    将代码反汇编查看一下,通过%edi寄存器来传递参数,在函数体内部通过edi的低位把参数复制栈的空间中,到如下:

    而传指针和传指针的指针的代码diff的结果如下:

 

究其原因是因为内存和cpu为了保存运行现场进行了压栈操作,把参数放到了寄存器%rdi中进行传递,这样就事实上产生了一个复制过程。同样的道理,但是这里传递的是栈中地址赋值给rdi还是栈中内容赋值给rdi。

通过汇编来分析c代码确实能够让自己看的更明白。以后继续,嘻嘻~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值