• 内存函数 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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;
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    二、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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    1. 当3 4 5 6 7 传递给 1 2 3 4 5时
      src>dest指针 从前往后传递
      在这里插入图片描述
    2. 当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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    ffmpeg.exe系统错误,出现找不到avutil-56.dll
    LeetCode 89 格雷编码
    AlphaCode:程序员的另类“内卷”?
    flink 入门(一)
    为什么实际开发中不推荐使用外键?
    网络安全渗透测试工具之skipfish
    OPPO主题组件开发 - 调试与预览
    opencv实现图像的融合
    经济发展由新技术推动着来
    tiup mirror sign
  • 原文地址:https://blog.csdn.net/qq_62939852/article/details/125623081