这篇文章将讲解关于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。
我们还是使用该函数来进行示例:
好了,我们今天对这些函数的学习就到这里。如果您觉得这篇文章哪里还有不足或者错误,请留下您珍贵的评论和意见。如果您觉得这篇文章有帮助到你,请留下您珍贵的点赞、收藏+评论,这对于我将是莫大的鼓励!学海无涯,共勉!