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也指向该内存。

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值