码迷,mamicode.com
首页 > 编程语言 > 详细

数组和指针作为函数参数——高质量C、C++编程指南

时间:2015-06-14 18:37:11      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:c++基础   指针   内存泄露   指针参数   指向指针的指针   

本文内容出自《高质量C、C++编程指南》。阅读之后理解,然后通过自己的话和例子讲清楚,这样才是学习之道。以下内容都是自己所认为的东西,如果哪里错了,希望各位大神指出。


1、数组作为函数的参数进行传递时,该数组自动退化为同类型的指针

技术分享

技术分享

结果:

技术分享

第一张图中,str为数组,此时的长度为6,而作为函数参数时退化为指针了,指针的长度固定为4。

第一张图中,str为数组,所以不能对str进行自增或自减,而在函数中是可以的,因为退化为指针了,而指针时可以进行自增自减的。


2、指针参数是如何传递内存的

传递方式分值传递和引用传递,而指针参数其实用的是值传递。这里没有说错,看下面分析。

技术分享

技术分享

技术分享

可以看出,实参pStr和形参p所指向的地址是一样的(都是3866140),而pStr(3866128)和p(3865916)的地址是不一样的。

原因:编译器为函数的每个参数制作临时副本,指针参数p的副本是_p,编译器使_p=p。所以,形参p是实参pStr的副本,都指向了str。函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改,这也是指针可以用作输出参数的原因。


3、使用指针参数传递内存

用指针作为参数,在函数里为指针申请一块内存区间。

技术分享

技术分享

上面的例子申请内存会失败。因为形参p只是str的一个副本而已,让p指向新申请的内存,改变的是p的指向,而不是改变p原来指向的内容str。当p指向新内存时,p与str已经没有任何关系。

形参变量在函数结束时释放,造成了在堆上申请的内存没有释放,所以没执行一次函数就会丢失一块内存。


如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”。

通过一个图来来理解指针、指向指针的关系:

技术分享


使用指向指针的指针来申请内存:

技术分享

技术分享

此时为str申请内存是成功的。上面说过,指针做形参时编译器会为其生成一个副本,内容是一样的。

所以,pp是ppStr的副本,形参pp和实参ppStr指向相同的内容str,那么*pp的内容就是str,对*pp的操作就是对str的操作,*pp指向新申请的内存,因此str也指向该内存。

记得最后一行代码,要释放在堆上申请的内存,不然会导致内存泄露。


还是不明白的可以看下下面的图:

技术分享

数组和指针作为函数参数——高质量C、C++编程指南

标签:c++基础   指针   内存泄露   指针参数   指向指针的指针   

原文地址:http://blog.csdn.net/wxc237786026/article/details/46489329

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!