C语言内存函数memcpy,memmove,memcmp
一、memcpy函数
1.用法
memcpy表示内存函数,用法跟strcpy差不多, 都是作为拷贝函数存在
strcpy只能用于字符串函数,而memcpy函数可以使用任意类型
在使用任意类型时,肯定用到的参数是void
void* memcpy(const void *dest,const void *src, size_t sum);
这里的sum作为字节数传递
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10]={0};
int arr2[10]={1,2,3,4,5,6,7,8,9,10};
memcpy(arr1,arr2,20);//1 2 3 4 5 /20作为字节数 即传递4个整形
return 0;
}
2.模拟实现memcpy函数
#include<stdio.h>
#incldue<assert.h>
void*mymemcpy(const void*dest,const void*src,size_t sum)//size_t说明作为无符号数存在
{
assert(dest&&src);
void*ret=dest;
while(sum--)//void*的指针 无法解引用和自加自减,解引用不知道访问几个字节,自加自减不知道跳过结果字节
{
*(char*)dest=*(char*)src;//这里不使用自加的原因: 因为强制类型转换是一种临时的状态 如果到++时,指针会变回void*
dest=(char*)dest+1;
src=(char*)src+1;
}
return ret;
}
int main()
{
int arr1[10]={0};
int arr2[10]={1,2,3,4,5,6,7,8,9,10};
mymemcpy(arr1,arr2,20);//传递4个整形
return 0;
}
二、memmove函数
1.用法
memmove函数是用于处理内存重叠的情况
参数同memcpy函数相同
voidmemmove(const void dest,const void*src,size_t sum);
#include<stdio.h>
#include<string.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};//将 1 2 3 4 5传给 3 4 5 6 7
memmove(arr+2,arr,20);//结果为 1 2 1 2 3 4 5
return 0;
}
2.模拟实现memmove函数
#include<stdio.h>
#include<assert.h>
void*mymemmove(const void*dest,const void*src,size_t sum)
{
assert(dest&&src);
void*ret=dest;//返回目的地的初始地址
if(src>dest)//src大于dest指针时 从前往后传递
{
while(sum--)
{
*(char*)dest=*(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
}
}
else//src小于dest指针时 从后往前传递
{
while(sum--)
{
*(char*)(dest+sum)=*(char*)(src+sum);
}
}
return ret;
}
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
mymemmove(arr+2,arr,20);//20代表字节数 即传递5个整形
return 0;//1 2 1 2 3 4 5
}
当3 4 5 6 7 传递给 1 2 3 4 5时
src>dest指针 从前往后传递
当1 2 3 4 5传递给 3 4 5 6 7时
src>dest指针 从后往前传递
三、memcmp函数
1.用法
同strcmp函数用法差不多 都为比较函数
但strcmp只能比较字符串之间的大小
而 memcmp函数可以比较任意类型的大小
int memcmp(const void * s1,constvoid* s2,size_t sum);
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[]={1,2,3,4,5};
int arr2[]={1,1,3,4,5};
memcmp(arr1,arr2,8);//8为字节数 即2个整形
return 0;
}
2.模拟实现memcmp函数
#include<stdio.h>
#include<assert.h>
int memcmp(const void*s1,const void*s2,size_t sum)
{
assert(s1&&s2);
char*pa=(char*)s1;
char*pb=(char*)s2;
while(sum--)
{
if(*pa==*pb)//两者有相同才向后移 没有就等sum减为0 输出 看是大于还是小于
{
pa++;//如果两者一直相同 不影响判断条件sum 出循环输出
pb++;
}
}
return *pa-*pb;
}
int main()
{
int arr1[]={1,2,3,4,5};
int arr2[]={1,1,3,4,5};
int ret= memcmp(arr1,arr2,8);//8为字节数 即2个整形
printf("%d\n",ret);//1
return 0;
}
到此这篇关于C语言内存函数 memcpy,memmove ,memcmp的文章就介绍到这了,更多相关C语言内存函数内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
相关文章