目录
一、前言
二、 memmove和memcmp函数
1.memmove函数(内存移动)
函数的使用:
memmove函数的模拟实现
2、memcmp函数(内存比较)
函数的使用:
一、前言
前面我们已经讲了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的数,如果是大端就不一样了,这里就不说那么多了,下次会涉及。
这期结束了,兄弟们一键三连