C语言中,如何将memcpy、memmove、memcmp三个函数改写成长尾词?

2026-04-12 10:061阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1103个文字,预计阅读时间需要5分钟。

C语言中,如何将memcpy、memmove、memcmp三个函数改写成长尾词?

目录

一、memcpy函数

1.用法

2.模拟实现memcpy函数

二、memmove函数

1.用法

2.模拟实现memmove函数

三、memcmp函数

1.用法

2.模拟实现memcmp函数

一、memcpy函数

1.用法

memcpy函数用于复制内存块,它将源内存地址中的内容复制到目标内存地址。

2. 模拟实现memcpy函数cvoid my_memcpy(void *dest, const void *src, size_t n) { char *d=(char *)dest; const char *s=(const char *)src; while (n--) { *d++=*s++; }}

二、memmove函数

1.用法

memmove函数与memcpy类似,但可以处理源和目标内存重叠的情况。

2. 模拟实现memmove函数cvoid my_memmove(void *dest, const void *src, size_t n) { if (dest==src) return; if ((dest (char *)src)) { while (n--) { *(char *)(dest + n)=*(char *)(src + n); } } else { while (n--) { *(char *)dest++=*(char *)src++; } }}

三、memcmp函数

1.用法

memcmp函数用于比较两个内存块的前n个字节。

2. 模拟实现memcmp函数cint my_memcmp(const void *s1, const void *s2, size_t n) { const unsigned char *p1=(const unsigned char *)s1; const unsigned char *p2=(const unsigned char *)s2; while (n--) { if (*p1 !=*p2) return *p1 - *p2; p1++; p2++; } return 0;}

目录
  • 一、memcpy函数
    • 1.用法
    • 2.模拟实现memcpy函数
  • 二、memmove函数
    • 1.用法
    • 2.模拟实现memmove函数
  • 三、memcmp函数
    • 1.用法
    • 2.模拟实现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函数

memmove函数是用于处理内存重叠的情况
参数同memcpy函数相同
voidmemmove(const voiddest,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指针 从前往后传递

C语言中,如何将memcpy、memmove、memcmp三个函数改写成长尾词?

当1 2 3 4 5传递给 3 4 5 6 7时
src>dest指针 从后往前传递

三、memcmp函数

同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语言内存函数内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

本文共计1103个文字,预计阅读时间需要5分钟。

C语言中,如何将memcpy、memmove、memcmp三个函数改写成长尾词?

目录

一、memcpy函数

1.用法

2.模拟实现memcpy函数

二、memmove函数

1.用法

2.模拟实现memmove函数

三、memcmp函数

1.用法

2.模拟实现memcmp函数

一、memcpy函数

1.用法

memcpy函数用于复制内存块,它将源内存地址中的内容复制到目标内存地址。

2. 模拟实现memcpy函数cvoid my_memcpy(void *dest, const void *src, size_t n) { char *d=(char *)dest; const char *s=(const char *)src; while (n--) { *d++=*s++; }}

二、memmove函数

1.用法

memmove函数与memcpy类似,但可以处理源和目标内存重叠的情况。

2. 模拟实现memmove函数cvoid my_memmove(void *dest, const void *src, size_t n) { if (dest==src) return; if ((dest (char *)src)) { while (n--) { *(char *)(dest + n)=*(char *)(src + n); } } else { while (n--) { *(char *)dest++=*(char *)src++; } }}

三、memcmp函数

1.用法

memcmp函数用于比较两个内存块的前n个字节。

2. 模拟实现memcmp函数cint my_memcmp(const void *s1, const void *s2, size_t n) { const unsigned char *p1=(const unsigned char *)s1; const unsigned char *p2=(const unsigned char *)s2; while (n--) { if (*p1 !=*p2) return *p1 - *p2; p1++; p2++; } return 0;}

目录
  • 一、memcpy函数
    • 1.用法
    • 2.模拟实现memcpy函数
  • 二、memmove函数
    • 1.用法
    • 2.模拟实现memmove函数
  • 三、memcmp函数
    • 1.用法
    • 2.模拟实现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函数

memmove函数是用于处理内存重叠的情况
参数同memcpy函数相同
voidmemmove(const voiddest,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指针 从前往后传递

C语言中,如何将memcpy、memmove、memcmp三个函数改写成长尾词?

当1 2 3 4 5传递给 3 4 5 6 7时
src>dest指针 从后往前传递

三、memcmp函数

同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语言内存函数内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!