本文内容出自《高质量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也指向该内存。
记得最后一行代码,要释放在堆上申请的内存,不然会导致内存泄露。
还是不明白的可以看下下面的图:
原文地址:http://blog.csdn.net/wxc237786026/article/details/46489329