一、前言
前面我们已经讲了memcpy和memset函数的使用,相信小伙伴们对这两个函数已经
非常熟悉了,(如果还不是很熟悉,可以看看上篇)那么我们现在要学习另外两个函数
memmove和memcmp。
本章内容memmove和memcmp函数
二、 memmove和memcmp函数
1.memmove函数(内存移动)
函数参数形式:void*memmove(void*destination,const void*source,size_t num);
其中num是无符号的整数,单位是字节。memcpy函数不能实现重复部分的拷贝,
如在同一个数组中无法实现,但是memmove可以实现重复内存拷贝。也可以说
memcpy是memmove的子集。
函数的使用:
#include<stdio.h> #include<string.h> int main() { int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; memmove(arr1,arr1+2,20); for (int i = 0; i < 10; i++) { printf("%d ", arr1[i]);//34567678910 } return 0; }
memmove函数的模拟实现
#include<stdio.h> #include<assert.h> void*my_memmove(void*dest, const void*src, size_t num) { assert(dest&&src); void*ret = dest; if (dest < src) { while (num--) { *(char*)dest = *(char*)src; ++(char*)dest; ++(char*)src; } } else { while (num--) { *((char*)dest + num) = *((char*)src + num); --(char*)dest; --(char*)src; } } return ret; } int main() { int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; my_memmove(arr1, arr1+2, 5 * sizeof(int)); for (int i = 0; i < 10; i++) { printf("%d", *(arr1 + i));//34567678910 } return 0; }
2、memcmp函数(内存比较)
memcpy函数参数形式int memcmp(const void *str1,const void* str2,size_t num);
这个函数的返回类型是int ,nu单位是字节(一个int 4字节),str1大于str2返回一个
大于0的数,str1小于str2则返回一个小于0的数,等于则返回0。
#include<stdio.h> #include<string.h> int main() { int arr1[10] = { 1, 2, 3, 4, 5, 6, 7 }; int arr2[10] = { 1, 2, 3, 4, 5, 8, 9 }; int kc = memcmp(arr1, arr2, 20); printf("%d", kc); return 0; }
注意:本电脑是小端存储模式(以后会讲),简单的说就是高位存高地址,大端则相反如1为
00000001,小端模式下为01000000。
简单的说一下:如图
在小端中:
#include<stdio.h> #include<string.h> int main() { int arr1[10] = { 1, 2, 3, 4, 5, 6, 7 }; int arr2[10] = { 1, 2, 3, 4, 5, 8, 9 }; int kc = memcmp(arr1, arr2, 21); printf("%d", kc); return 0; }
结果是一个小于0的数,vs编辑器默认是-1,原因在于前面20个字节相同,但是第21个字节,
如图:
所以arr1小于arr2,返回小于0的数,如果是大端就不一样了,这里就不说那么多了,下次会涉及。