c++语言memmove函数的使用和模拟实现

一、memmove函数的介绍

 68bea79bfe75447aa7b2b0154222746d.png

由图可知memmove函数的返回值是void*,void*的指针可以接收任何类型的地址。destination是目标空间,source是原空间,这个函数的作用就是将原空间的num个大小字节的空间复制到destination上去。这个函数与memcpy函数相似,这个函数的特点是在复制的时候允许原空间和目标空间又重叠的部分。切记num的空间是以字节为单位的,例如我们要复制5个整型大小空间的内容,这是num不是5,而是20。因为每个整型占四个字节。

二、memmove函数的使用

2d493125d8324fdc92df7e4b43d78e22.png

memmove函数的使用需要包含<string> 的头文件,上述代码是把数组下标为2开始向后的5个整型数字复制到数组下标为1开始向后5个大小整型空间里。

三、memmove函数的模拟实现

让我们先讨论src<dest的情况

78af0fc99fe040079f61f03f8e0160ca.png

让我们先来看这种情况,这种复制是从src从前往后复制的,但是最后一次复制的时候原本应该将数字5复制到 数字8的位置上,但是此时原本数字5的位置已经发生改变,已经被覆盖了,此时原本数字5的位置已经变为2,这是就发生错误。那正确的是什么呢?

c837ccc3fbbd460b9ba7123ce41deebe.png

这时我们从src的最后一个开始即从数子5开始,把5放到8的位置,依次执行,这样就避免了覆盖的问题。 

接下来我们讨论src>dest的情况

3109291b364847f79305d7fd93d47399.png

同理当我们从后向前的时候当复制到数字5的时候,原本我们要讲数字5复制到数字3的位置,但此时5已经变为7,它们发生了覆盖 ,此时就是错误的。

那正确的应该是什么样的呢?

那当然是从前往后就可以解决啦!

04a699b2213947d0b11459a186f76d36.png

这样就可以解决上述问题啦

于是我们可以得出结论,当src<dest时可以采用从后往前(针对src的位置)复制 ,当src>dest时我们可以采用从前往后复;接下来让我们看代码8b98432ff2ad4eb7be82680ce7c85b8a.png

当我们主函数调用时,例如:

be08bc8e6a9742c0932ab59cc72d7967.png

这样就成功了。

我今天的分享就到此为止,如果上述有错误,希望各位读者不吝赐教,欢迎各位来指正,让我们一起进步吧!

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值