c语言内存函数

本文详细介绍了C/C++中的memcpy、memmove、memset和memcmp四个内存操作函数,包括它们的返回类型、参数含义和使用示例,特别强调了memmove在处理重叠内存复制的优势。
摘要由CSDN通过智能技术生成

  这篇文章将讲解关于memcpy、memmove、memset以及memcmp四个函数。

一、memcpy函数

我们可以看到这个函数返回类型为void*,有三个参数:

我们可以看到,该函数的返回类型是void*,有三个参数:

1.void * destination

这个参数是目的空间的地址

2.const void * source

这个参数是源空间的地址

3.size_t num

这个参数是你要复制的内容空间的大小,以字节为单位

注意:

这个函数在遇到'\0'时并不会停下来。

我们现在对memcpy函数进行使用示例:

这里我们复制了a数组中20字节大小的内容(即5个元素)到b数组中。

关于memcpy遇到\0不会停下来的问题,我们也来做个示例:

可以看到memcpy遇到\0确实没有停下来,复制了\0后面的d。


二、memmove函数

首先来看,memmove函数的返回类型以及参数:

void * memmove(void * destination,const void * source,size_t num)

我们可以看到,该函数的返回类型是void*,有三个参数:

1.void * destination

这个参数是目的存储块的地址

2.const void * source

这个参数是源存储块的地址

3.size_t num

这个参数是你要移动的存储块的大小,以字节为单位

这个函数的作用是复制存储块。

复制source地址上num个字节大小的内容到destination地址上。

这个函数不会检查source中是否有空字符,你的num是多少,它就复制多少。

它的返回值是destination。

我们现在对memmove函数进行使用示例:

这里我们复制了a数组中20字节大小的内容(即5个元素)到b数组中。

这时细心的你会发现,这事memcpy不是也能做吗?

值得注意的是,memcpy不能用来复制有重叠的内容。

但是这点memmove可以做到。

我们来用几张图片理解一下:

当我们想将一个数组中的src这块内容复制到dest中,使用memcpy可能会出现一些意想不到的结果

我们想要得到的结果是1,2,3,3,4,5,6,7,9,10

我们首先将src中的3复制到dest中去:

当我们再想把src中的4复制给dest时

这时问题就显现出来了:

原来的4被复制过来的3覆盖了。

这就是memcpy函数可能存在的问题。

使用当涉及到有重叠内存的复制时,memmove能很好地解决这一问题

ps:有的编译器不会有这样的问题,可能是因为它们的memcpy函数实际上用的时memmove函数的算法。


三、memset函数

它的作用是以字节为单位填充指针指向的那块空间。

首先它同样有三个参数:

1.  void* ptr

首先它是一个指针,指向要被填充的那块空间。

2.   int value

要设置的字母的值。该值以 int 的形式传递,但该函数使用此无符号字符转换填充那块指针指向的空间。

3.num

即你想要填充那个字符的个数

我们照样使用这个函数来进行示例:

我们可以看到,a数组中的I被替换成了Y。


四、memcmp函数

这个函数的作用是挨个比较ptr1和ptr2两个指针所指向的空间的字符。

num是比较字符的个数。

如果第一个空间的字符大于第二个空间的字符,返回大于0的值。

如果第一个空间的字符小于第二个空间的字符,返回小于0的值。

如果第一个空间的字符等于第二个空间的字符,返回0。

我们还是使用该函数来进行示例:



好了,我们今天对这些函数的学习就到这里。如果您觉得这篇文章哪里还有不足或者错误,请留下您珍贵的评论和意见。如果您觉得这篇文章有帮助到你,请留下您珍贵的点赞、收藏+评论,这对于我将是莫大的鼓励!学海无涯,共勉!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值