分析传递指针的指针
来源:互联网 发布:c语言编辑器 编辑:程序博客网 时间:2024/06/10 06:31
很多人都应该记得一道很经典的C的面试题:
看到这个题目大家都应该知道答案,并能说出理由是:在传递过程中参数会在栈上做一个复制品,在函数体内进行操作的是这个复制品。这也就时我们为什么在休要修改一个变量值是要传递指针的原因了。如图所示:
我们这时操作的是arga这个变量的值,而不是a的值。如果传入指针,同样是有一个复制,但是是我们的目标操作对象不是指针本身而是指针指向的堆上的一个区域。这是操作这个值是没有问题的,但是如果我们要修改指针指向的位置,也就是说要重新给指针赋值,那样的话传递指针就不可能实现了。解决方案是传递指针的指针,这样复制品中存储的是指针本身的地址,修改这个复制品指针指向的值也就是修改原来指针中存储的地址。
如此我们在理论上了解的问题产生的原因和解决的方案。但我有这样的疑问为什么会产生复制呢?
将代码反汇编查看一下,通过%edi寄存器来传递参数,在函数体内部通过edi的低位把参数复制栈的空间中,到如下:
而传指针和传指针的指针的代码diff的结果如下:
究其原因是因为内存和cpu为了保存运行现场进行了压栈操作,把参数放到了寄存器%rdi中进行传递,这样就事实上产生了一个复制过程。同样的道理,但是这里传递的是栈中地址赋值给rdi还是栈中内容赋值给rdi。
通过汇编来分析c代码确实能够让自己看的更明白。以后继续,嘻嘻~~~
- 分析传递指针的指针
- 传递指针和传递指针的指针
- C指针传递,指向指针的指针。
- 指针传递分析与解决
- 函数指针的传递
- 指针的传递
- 传递指针的引用
- 指针的传递
- 指针型形参和指针引用的传递
- Post/Send Event传递指针的危险性分析
- 指针传递遇到的问题--内存角度分析
- 传递参数时,指针和指针的指针的区别
- 指针传递
- 指针传递
- 指针传递
- 函数指针的传递问题
- 传递指向指针的引用
- COM接口指针的传递
- Eclipse CDT中增加SNMP++ libary
- 各种状态
- 使用GDB调试Android中的C/C++程序
- SQLite入门与分析(三)---内核概述(2)
- Android 判断数据库中是否存在某个表
- 分析传递指针的指针
- .Java内存管理(一、内存分配)
- 用PHP程序写一个算法:求一个网段的开始,结束IP地址
- linux之编程环境搭建步骤--nfs/tftp/svn/boost/dnw/samba
- java.util.date|| java.sql.date||java.sql.timestamp 使用
- 【转】LCD移植记录
- SQL Server连接中的常见错误及修正办法
- C++线程池源代码实现1
- 协议分析常用网站