深入理解双指针.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入理解双指针

深入理解双指针 收藏 写在前面的申明: 深入对双指针进行解析和理解。此文章由我以前在Chinaunix博客原创,现在博客搬家到CSDN了,不过google下,发现此文章已被以为仁兄转载,但是没有注明原文出处。在此,我对此文章做了进一步的修改重新放在我的CSDN博客中。 现在大家看到的最新版本的《深入理解双指针》是经过我多次修改后结果。目前,百度后所有的《深入理解双指针》均来自我的原创之前发表在ChinaUnix博客中。现转移至CSDN博客。希望大家转载注明原文出处。 对于C语言的参数传递都是值传递,当传传递一个指针给函数的时,其实质上还是值传递,除非使用双指针。 在讲双指针之前,还是先讲讲关于C语言函数调用的本质。 函 数调用操作包括从一块代码到另一块代码之间的双向数据传递和执行控制转移。数据传递通过函数参数和返回值来进行,包括局部变量的空间分配与回收,都是通过 栈来实现的。绝大多数CPU上的程序实现使用栈来支持函数调用操作。栈被用来传递函数参数、存储返回信息、临时保存寄存器原有值以备恢复以及用来存储局部 数据。当函数A调用函数B的时候,会把A的变量和参数压入到栈中,然后接着将B的变量和参数,局部变量压入到栈中。然后当A调用B是,B其实是在栈中取得 A传递的参数和值,从而达到值传递的效果。 以一个交换2个数的值的函数调用为例。 view plaincopy to clipboardprint? void swap ( int *a, int *b ){ int c; c = *a; *a = *b; *b = c; } int main(int argc, char **argv){ int a,b; a = 16; b = 32; swap( a, b); return ( a - b ); } 那么,这段代码编译成汇编语言之后,除了会有代码段,数据段,堆栈,那么在调用的时候,会把main函数的参数变量压入main函数的栈帧,然后接着会压入swap函数的局部变量和参数 那么按照刚才上述理论,编译成汇编语言以后,这个图就是函数调用的时候内存形态。 view plaincopy to clipboardprint? void swap ( int *a, int *b ){ int *temp; temp = NULL; temp = a; a = b; b = temp; } int main ( int argc, char **argv ){ int a,b; a = 16; b = 32; swap(a, b); return ( a - b ); } 这种方式按照理论上来说,是想通过调用swap函数,在swap函数内部,实现将交换a,b,即交换a和b的地址来达到目的。这样绝对不可以。因为当把a,b的地址传到swap函数之后,按照上述栈帧图的结构来看,最终swap函数值通过栈指针来实现的,当swap使用的时候,还是把 a,b的地址复制到寄存器中才能运算。那么,大家也许就明白了,swap把a,b的地址复制到寄存器中,然后运算,相当于抱着a,b的副本跑了,然后去操作,这些所有针对a,b副本的操作管main函数中的a,b什么事? 当swap返回之后,这些寄存器或者是栈空间随着swap的然会而释放了,而 main函数的a,b没发生任何变法。所以上述代码是错误的,无法实现你想要的功能。 当我们用二级指针来实现上述功能的时候有就可以达到效果。 view plaincopy to clipboardprint? void swap ( int **a, int **b ){ int *tmp = NULL; tmp = *a; *a = *b; *b = tmp; } int main () .... .... 这个时候,你会发现就能实现达到交换的目的。 这就是双指针神奇的功能,突破C语言传值的概念。那么,双指针是如何达到效果的呢? 当我们申明 **a之后,其实双指针变量a其实已经存在了。那么在内存中的效果如下图 那么,p中放的是中间桥梁bridge的地址bridge,则*p就是中间桥梁bridge的内容即是目标操作数的地址income,从而**p就是目标操作数 再来看这个图,p就是这里**a种的a.当我们申明*

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档