一、memcpy(内存拷贝函数)
函数定义:void * memcpy ( void * destination, const void * source, size_t num ); 这里的count是整个需要拷贝的元素大小
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的
使用:
模拟实现:
二、memmove(内存重叠,内存拷贝函数)
两个没有内存重叠的两个数组进行的相互拷贝,但是在内存出现重叠的情况时,memcpy函数在某些编译器下是无法实现的,所以我们就要用到memmove函数
参数类型:void * memmove ( void * destination, const void * source, size_t num );
mommove和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理
使用:
模拟:
注意:我们的拷贝有两种情况,第一种情况:当dest的地址小于src的地址,证明我们需要把src的内容向左拷贝,为了可以保证拷贝的成功,我们的src需要从小到大去进行拷贝
第二种情况:当dest的地址大于src的地址,我们把前面的元素向后拷贝,所以是把元素向右拷贝,这时为了保证地址重叠部分不被先行改变,所以先拷贝最后一个元素,倒着进行赋值,这样可以保证拷贝的数据准确不出错误
下图是简单说明:
三、memset函数(内存设置函数)
参数类型:void * memset ( void * ptr, int value, size_t num );
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容
使用:
你看这里就将前五个字符换成了‘x’
模拟:
四、memcmp函数(内存比较函数)
参数类型:int memcmp ( const void * ptr1, const void * ptr2, size_t num );
⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
使用:
模拟:
逐一比较每一个字节所对应的地址元素是不是相等,如果相等两个指针分别加1继续推移向下一个字节进行比较,如果两个元素存在大小的差异,直接返回这两个元素对应assic差异。
如有问题,欢迎大家评论指正!