• (c语言进阶)内存函数


    一.memcpy(void* dest,void* src,int num)   ,操作单位为字节,完成复制且粘贴字符串

    1.应用 

    1. #include
    2. #include
    3. int main()
    4. {
    5. int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    6. int arr2[20] = { 0 };
    7. memcpy(arr2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2
    8. int i = 0;
    9. for (i = 0; i < 5; i++)
    10. {
    11. printf("%d ", arr2[i]);
    12. }
    13. return 0;
    14. }

     2.模拟实现

    1. #include
    2. #include
    3. #include
    4. //因为该函数需要能操控任意类型的数据,故不能将参数设定为固定类型
    5. //而void类型可以接收任意类型的值
    6. void* my_memcpy(void* arr2,const void* arr1,int x)//将arr1中的元素拷贝给arr2
    7. {
    8. assert(arr1&&arr2); //不能为空指针
    9. void* ret = arr2; //保存被赋值数组的首地址
    10. while (x--)
    11. {
    12. *(char*)arr2 = *(char*)arr1; //void*类型无法解引用,需要转换为其他类型
    13. arr1 = (char*)arr1 + 1; //转化为char*类型,可每次只改变一个字节,可适用于任何类型
    14. arr2 = (char*)arr2 + 1;
    15. }
    16. return ret; //返回被赋值数组的首地址
    17. }
    18. int main()
    19. {
    20. int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    21. int arr2[20] = { 0 };
    22. my_memcpy(arr2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2
    23. int i = 0;
    24. for (i = 0; i < 5; i++)
    25. {
    26. printf("%d ", arr2[i]);
    27. }
    28. return 0;
    29. }

     3.重点——memcpy()可以处理,但不用来处理重叠内存之间的数据拷贝(这种问题统一交给memmove函数——分工明确)

    1. #include
    2. #include
    3. int main()
    4. {
    5. int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    6. int arr2[20] = { 0 };
    7. memcpy(arr1+2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2
    8. int i = 0;
    9. for (i = 0; i < 5; i++)
    10. {
    11. printf("%d ", arr2[i]);
    12. }
    13. return 0;
    14. }

    二.memmove(void* dest,void* src,int num) ——解决重叠内存之间的数据拷贝

    1.应用 

    1. #include
    2. #include
    3. int main()
    4. {
    5. int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    6. int arr2[20] = { 0 };
    7. memmove(arr1 + 2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2
    8. int i = 0;
    9. for (i = 0; i < 5; i++)
    10. {
    11. printf("%d ", arr1[i]);
    12. }
    13. return 0;
    14. }

    2.模拟实现 

    1. #include
    2. #include
    3. #include
    4. void* my_memmove(void* arr2 ,void* arr1, int x)//将arr1中的元素拷贝给arr2
    5. {
    6. void* p = arr2;
    7. assert(arr2&&arr1);
    8. if (arr2 <= arr1)
    9. {
    10. while (x--)
    11. {
    12. *(char*)arr2 =*(char*)arr1;
    13. arr1=(char*)arr1+1;
    14. arr2=(char*)arr2+1;
    15. }
    16. }
    17. else
    18. {
    19. while (x--)
    20. {
    21. *((char*)arr2 + x) = *((char*)arr1+x); //将指针指向需要赋值的空间最后-1,每次向前读取一个字节
    22. }
    23. }
    24. return p; //返回被拷贝的数组首地址
    25. }
    26. int main()
    27. {
    28. int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    29. int arr2[20] = { 0 };
    30. my_memmove(arr1 + 2, arr1, 28);//从arr1中读取20个字节,将其复制给arr1+2
    31. int i = 0;
    32. for (i = 0; i < 10; i++)
    33. {
    34. printf("%d ", arr1[i]);
    35. }
    36. return 0;
    37. }

     

     三.memcmp()——内存比较函数,比较单位为字节,可以比较任意类型的元素

     1.应用

    1. #include
    2. #include
    3. int main()
    4. {
    5. int arr1[] = { 1,2,3,4,5}; //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
    6. int arr2[20] = { 1,3,2 }; //01 00 00 00 03 00 00 00 02 00 00 00
    7. int ret = memcmp(arr1,arr2,12);//比较两个数组中前12个字节
    8. //arr1>arr2返回值为正整数,arr1=arr2返回值为0,arr1
    9. printf("%d",ret);
    10. return 0;
    11. }

     2.模拟实现

    1. #include
    2. #include
    3. #include
    4. int my_memcmp(void* arr1, void* arr2, int x)
    5. {
    6. assert(arr1 && arr2);
    7. while (*(char*)arr1 == *(char*)arr2) //相同的情况下,判断下一位是否也相同,不相同则退出循环
    8. {
    9. if (x==0) //若有其中一个字符串到达末尾,则退出循环
    10. {
    11. break;
    12. }
    13. arr1=(char*)arr1+1;
    14. arr2=(char*)arr2+1;
    15. x--;
    16. }
    17. return *(char*)arr1 - *(char*)arr2; //不相同则相减返回差值
    18. }
    19. int main()
    20. {
    21. int arr1[] = { 1,2,3,4,5}; //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
    22. int arr2[20] = { 1,3,3 }; //01 00 00 00 03 00 00 00 02 00 00 00
    23. int ret = my_memcmp(arr1,arr2,12);//比较两个数组中前12个字节
    24. //arr1>arr2返回值为正整数,arr1=arr2返回值为0,arr1
    25. printf("%d",ret);
    26. return 0;
    27. }

    四.memset()——内存初始化(初始化变量为整形或字符型)

    1.应用 

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[] = "hello bit";
    6. memset(arr,'x',5); //将arr地址后五个字节的内存初始化为‘x’
    7. printf("%s",arr);
    8. return 0;
    9. }

     

     2.模拟实现

    1. #include
    2. #include
    3. void* my_memset(void* arr, int value, int x)
    4. {
    5. void* p = arr;
    6. while (x--)
    7. {
    8. *(char*)arr = value;
    9. arr=(char*)arr + 1;
    10. }
    11. return p;
    12. }
    13. int main()
    14. {
    15. char arr[] = "hello bit";
    16. my_memset(arr+6,'1',3);
    17. printf("%s",arr);
    18. return 0;
    19. }

     

  • 相关阅读:
    手把手教程6-2: F460把debug printf功能改到UART1
    Python接口自动化测试post请求和get请求,获取请求返回值
    公众号查题接口 不限次数
    Idea中删除子模块后再重建同名模块maven无法识别
    unity中的模型坐标系与3dmax导出的模型坐标系不一致的解决方案
    教大家电脑重装系统后如何设置硬盘密码
    erlang练习题(二)
    MSDC 4.3 接口规范(21)
    电子行业库存管理痛点与WMS仓储管理系统解决方案
    el-table表格监听滚动是否到底部
  • 原文地址:https://blog.csdn.net/2301_79580018/article/details/134373004