C语言——内存函数

大家好!上期文章和大家分享了C语言字符函数和字符串函数有关知识。接下来我们再来了解一下C语言里的内存函数,记得三连支持一下哦!

c40edbd8fc9e44009c7fa30d4019a58e.jpeg

一、memcpy使⽤和模拟实现

memcpy也是一个拷贝函数,与strcpy不同的是它可以拷贝不同的数据,如:整型、浮点型、字符型、结构体等等,并且它也可以指定拷贝多少数据,只不过memcpy指定的大小是字节,所以我们在拷贝数据的时候要乘以数据类型的大小。在使用时我们要注意:

1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置;
2.这个函数在遇到 '\0' 的时候并不会停下来;
3.如果source和destination有任何的重叠,复制的结果都是未定义的;

4.使用时要包含头文件<string.h>.

7cf376df811e416dbcbbada636b76a8c.png

如:30fdd51be6f048a6a8c0b26d1f1addf2.png

下面我们来模拟实现一下:

4aa8289bb2254bd69bbd402e0b81cdfc.png

827c77cb1088459b8d05713a4750cca6.png

我们可以看到memcpy函数的返回类型和前两个参数都是void*类型,这就是为了使这个函数什么类型的数据都能拷贝,并且是通过指针来拷贝。由于事先我们不知道要拷贝什么类型的数据,所以我们将两个参数强制转换成char*类型一个字节一个字节的拷贝(char*大小就是一个字节)这样就可以实现任何类型数据都可以拷贝了。

我们再深入思考一下,既然函数参数是指针,那么它能不能拷贝前面的数据放在后面呢?我们可以来测试一下:92855d589a62415f8aab79b950030d4d.png

我们可以看到结果是:1 2 1 2 1 2 1 8 9 10。

结果并不对,正确的应该是:1 2 1 2 3 4 5 8 9 10。这是为什么呢?

这是因为C语言中规定memcpy拷贝内存不重叠的数据

cec31806d91c4fa09e0bd58438417a67.png

那么我们下面就来介绍可以实现重叠内存拷贝的函数——memmove.

二、memmove使⽤和模拟实现

memmove函数和memcpy函数相似,但是它拷贝的是重叠的内存。

607ea26ec4084631bb6b980fb28002ea.png

如:03077ccb5484433f9244aff5167386aa.png

我们可以看到memmove函数可以实现重叠内存的拷贝。

如何模拟实现呢?我们先来分析一下:

43948858200547ff9d188de4b7a85699.png

来看代码:dbd59525d84b4caa87a47045dfaa6e81.png

下面分析一下代码:3c5d7003ef514ca3ad9d5deac9955ab9.png

在这里我们要了解一下:

memcpy是拷贝内存不重叠的数据的函数

memmove是拷贝内存重叠的数据的函数,当然也可以拷贝内存不重叠的数据。

但是在vs2022上memcpy也可以拷贝内存重叠的数据。

三、memset函数的使⽤

memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
f83141d5aa694d4883f4a7f24093b91c.png

如:8775bc17f29b4ad19bc6fda80203a8b4.png

faba8740a5e84b36a06db37a050413e9.png

四、memcmp函数的使⽤

memcmp是内存比较函数,从两个指针指向的位置开始,比较后面num个字节的地址。

返回值:

a908f5c3f1234877832c60a58e030e3a.png

7e1192fcf228415d8d34cf287f672ba4.png

如:6f412c3102064f20aed8c6b2b113951a.png

好了,以上就是本篇文章的全部内容了,感谢大家的观看,如有错误感谢指正!创作不易,记得三连支持一下哦!

812dd1a160274e53b45d2b148cd7ba71.gif

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值