您的位置:首页 > 编程语言 > C语言/C++

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

2015-06-14 17:02 477 查看
本文内容出自《高质量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也指向该内存。

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: