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语言中数组作为函数参数时的自动退化为指针现象,解释了值传递与引用传递的区别,并深入探讨了使用指针参数传递内存时的内存分配与释放机制,以及如何正确地使用指针参数来管理内存资源,防止内存泄露。
3万+

被折叠的 条评论
为什么被折叠?



