C语言内存函数的使用及实现

关于内存函数的使用以及实现,昨天我们讲了关于string类型常用的函数使用以及实现,今天说一下关于内存函数的使用以及实现。

其中我们今天要介绍的内存函数有四个

memcpy

memmove

memcmp

memset

其中我们只实现一下memcpy和memmove剩下两个介绍一下

首先我们看一下memcpy

33f0f719736143c09338ca2edf4fa4a4.png

memcpy是一个拷贝函数,而昨天的strcpy是只可以拷贝字符类型的函数,而memcpy都可以拷贝,可是为什么所有的类型都可以拷贝?

首先我们来看一下他的参数,他的参数是两个void类型的两个指针,其中讲source 指针指向的内容拷贝num个到dest指向的位置,返回值是一个void类型的一个指针,返回拷贝后的指针。

e21e1e69d8b949bd91b8aef0670e1368.png

 我们来看一下,我们将被拷贝指针指向的num个字节拷贝到目标指针指向的位置,所以我们需要将void类型的指针,强制转化为char类型的一个指针,然后依次拷贝num个字节

 

下面我们介绍一下memmove

e7b37fed44454d78870bf42897acf3c6.png

memmove也是一个类似于拷贝的函数(其实这玩意和memcpy没啥区别,参数返回值都一样) ,但是mem可以自己给自己拷贝(不过现在的memcpy也可以给自己拷贝),下面介绍一下如何实现

9391d67c3d824cbf8bd365106bdd7d1c.png

 memmove函数的参数以及返回值和memcpy都是相同的,同样的void的指针的意思也是相同的,为了可以接收所有的指针类型,我们来看一下他们是怎么样实现的

其中分几种情况

6d490acf29704d8bb2c19559f352363a.png

首先是我们将str指向的3个值拷贝到dest指向的三个值中,此时如果我们从前向后拷贝的时候会成这样

 95f5e8a960a645a9b2030e0840a7d722.png

就会变成这样,导致后面的值会被覆盖,导致拷贝出错,所以这时候我们应该从后向前拷贝

 还有一种情况

ecfc2620d5b24e76875c2ae173d92f32.png

 就是被拷贝的指针在目标指针的后面,此时如果我们从后向前拷贝的话就会成了这样

19883a44cdd046ad9d8e013d4fba68fd.png

 同样导致值被覆盖,所以这时候我们应该从前向后拷贝

最后一种情况

dd6a776e4f484af2b61c61a958e8835f.png

这种情况下,两个指针指向的空间没有交集,所以我们不管是从前向后或者是从后向前拷贝都是没有问题的,所以现在我们来看一下如何实现

 db060df233ea4283b9e44cd1330ba9a3.png

所以我们总结一下就是这样的,现在来看如何实现一目了然d2006ba34bfb469c86f803c765d99ff6.png 

我们我们在拷贝的时候要判断一下str和dest的大小,如果dest小于str这时候我们要从后向前拷贝,str大于dest就从前向后

下面我们简单介绍一下剩下的两个函数

f71622cc605342ef80bd1c0a4bb6ae8c.png 

e650845242374922a5f1e91641735709.png 

这两个函数memcmp是用来比较的,同样是转化为char类型的指针然后一个一个字符进行比较

memset是用来设置内存中的值,但是他是一个字符一个字符设置 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naxx Crazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值