前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内存函数 memcpy,memmove ,memcmp

内存函数 memcpy,memmove ,memcmp

作者头像
lovevivi
发布2022-11-10 14:42:22
6980
发布2022-11-10 14:42:22
举报
文章被收录于专栏:萌新的日常

一、memcpy函数

1.用法

memcpy表示内存函数,用法跟strcpy差不多, 都是作为拷贝函数存在 strcpy只能用于字符串函数,而memcpy函数可以使用任意类型 在使用任意类型时,肯定用到的参数是void void* memcpy(const void *dest,const void *src, size_t sum); 这里的sum作为字节数传递

代码语言:javascript
复制
#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函数

代码语言:javascript
复制
#include<stdio.h>
#incldue<assert.h>
void*mymemcpy(const void*dest,const void*src,size_t sum)//size_t说明作为无符号数存在
{
 assert(dest&amp;&amp;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);

代码语言:javascript
复制
#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函数

代码语言:javascript
复制
#include<stdio.h>
#include<assert.h>
void*mymemmove(const void*dest,const void*src,size_t sum)
{
 assert(dest&amp;&amp;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
}
  1. 当3 4 5 6 7 传递给 1 2 3 4 5时 src>dest指针 从前往后传递
在这里插入图片描述
在这里插入图片描述
  1. 当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);

代码语言:javascript
复制
#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函数

代码语言:javascript
复制
#include<stdio.h>
#include<assert.h>
int memcmp(const void*s1,const void*s2,size_t sum)
{
  assert(s1&amp;&amp;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;
} 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、memcpy函数
    • 1.用法
      • 2.模拟实现memcpy函数
      • 二、memmove函数
        • 1.用法
          • 2.模拟实现memmove函数
          • 三、memcmp函数
            • 1.用法
              • 2.模拟实现memcmp函数
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档