前言

一、memcpy

1.介绍

2.使用

3.模拟实现

二、memmove

1.介绍

2.模拟实现

三、总结


前言

上一文,学习了字符串相同函数的使用,在某些场合,数据的类型不限于字符串,有可能是整形,浮点型甚至是自定义类型,所以内存函数(memcpy、memmove)就能实现数据的拷贝和移动

本文依就从函数的使用和模拟实现来介绍内存函数

一、memcpy

1.介绍

函数的作用是拷贝

函数的原型是含有三个参数,第一个参数为拷贝的目的地,第二个为拷贝的来源,第三个为拷贝的字节数。它将返回拷贝后数据的起始位置

同样的,必须包含memory.h或者string.h头文件

2.使用

接下来通过一个简单例子,理解memcpy的使用

创建了一个结构体类型,将s1内容拷贝给s2

memcpy函数的第一个参数为目的地地址,第二个参数为来源地址,第三个参数为来源内容的字节

3.模拟实现

思路:

要实现任意类型,那么函数的前俩个参数必须是void* 这样才能接收各种参数,其返回类型也必须是void*

拷贝---赋值,每次赋过去一个字节,之后让指针往后走一字节。

由于void*指针不能加减,所以必须将其强制类型转换为char*

那就来看看代码吧

void* my_memcpy(void* des, const void* sour, size_t num)
{assert(des && sour);void* head = des;while (num--){*(char*)des = *(char*)sour;des = (char*)des+1;sour = (char*)sour+1;}return head;
}

二、memmove

在strcat、strcpy中,不能自己追加自己,因为会把'\0'覆盖掉

类似的,memcpy想要拷贝自己的内容,也会出现失败

例如,有以下代码

我们想得到的预期结果应该是1 2 1 2  3  4  7

而实际上却得到  1 2  1 2 1 2  7

原因也很简单,在memcpy拷贝时,是一个字节一个字节的拷贝

在拷贝第三个数字,原本的数字3已经被覆盖为1,所以就得不到想要的结果

所以想要得到正确的结果就可以用memmove

1.介绍

这回就能得到我们想要的结果1 2 1 2 3 4 7

memmove函数参数有三个,第一个是目标位置地址,第二个是来源地址,第三个参数是拷贝的字节数目,返回类型是void*。该函数可以接收或者返回任意类型的数据

2.模拟实现

思路:

对于一个数组内容为

1 2 3 4 5 6 7,我们想将3级往后的3个元素拷贝到1 ,从3开始一个字节一个字节的拷贝是没有问题

但是想将1及往后的4个元素1 2 3 4 从1一开始拷贝到3 4 5 6上,就无法实现,其原因和strcat类似,会出现字符串覆盖。但是我们可以反过来,先拷贝4 ,在拷贝3,在拷贝2,最后拷贝1,就不会出现覆盖的问题。

根据这个想法,我们把元素分成俩种情况

  • 从前往后拷贝--------从源 起始位置一个一个拷贝至最后一个元素
  • 从后往前拷贝--------从源 某位置一个一个往前拷贝

上述就可以解决覆盖的问题

还有一类不存在覆盖,即从前往后拷贝和从后往前拷贝不影响结果,我们可以将这一类归到俩种的任一种。本文贵在第二种,代码较为简洁。

举例:从后往前拷贝,条件是des<sour

就有这些铺垫,那么我们就可以来模拟实现

void* my_memmove(void* des, void* sour, size_t num)
{assert(des && sour);const void* head = des;//从前往后移动if (sour > des){while (num--){*(char*)des = *(char*)sour;des = (char*)des + 1;sour = (char*)sour + 1;}}else//从后往前拷贝{while (num--){//找到最后的位置*((char*)des + num) = *((char*)sour + num);}}return head;
}

三、总结

在拷贝时,不要使用memcpy自己拷贝自己,这种情况用memmove。

memmove的思想依旧涉及较高的指针,值得大家练习。

最后,感谢大家的阅读。

我是小凡,欢迎大家提出宝贵的见解。

代码++

offer++

memcpy、memmove相关推荐

  1. C和指针之字符串memcpy、memmove、memset使用总结

    1.介绍memcpy.memmove.memset 1) void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开 ...

  2. memcpy、memmove、memset、memchr、memcmp、strstr详解

    第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...

  3. 【C语言】memcmp、memcpy、memmove、memset、memchr函数详解

    目录 一.综述 二.介绍 1.memcmp 2.memcpy 3.memmove 4.memset 5.memchr 一.综述 memcmp.memcpy.memmove.memset.memchr都 ...

  4. C语言:memcpy、memmove等函数的了解,使用以及模拟实现

    C语言:memcpy.memmove等函数的了解,使用以及实现 1.memcpy函数的介绍,使用,以及实现 2.memmove函数的介绍,使用,以及实现 1.memcpy函数的介绍,使用,以及实现 1 ...

  5. C语言 -- string.h中函数功能详解与手动实现 - 02(常用函数memcpy、memmove、strcpy、strdup、strcat、strtok...)

    内容预览 3.5.搬迁类型 --- 函数功能详细说明 :将内存空间中内容移动.复制到另一内存空间 3.6.搬迁类型 --- 函数功能测试与手动实现 3.6.1.memcpy.memccpy 3.6.2 ...

  6. 如何用C语言实现各种字符函数和字符串函数strstr、memcpy、memmove、strlen、strcpy、strcmp、strcat

    用C语言模拟实现字符函数与字符串函数 strstr.memcpy.memmove.strlen.strcpy.strcmp.strcat 若使用本文相关代码,还请动手点个赞!!! #define _C ...

  7. memcpy、memmove、memcmp、memset函数的使用说明和模拟实现

    在前面的文章中,我已经对字符串函数进行了详细的介绍和模拟实现,今天,我来讲解另一类函数----------内存函数. 这里写目录标题 memcpy函数 memmove函数 memcmp函数 memse ...

  8. strcpy()、memcpy()、memmove()、memset()及其应用

    一.strcpy()实现, 字符串拷贝. char *strcpy(char *strDest, const char *strSrc) {     assert((strDest!=NULL) &a ...

  9. 赶紧来修炼内功发~内存函数详解大全-memcpy、memmove、memcmp

    目录 1. memcpy EX: PS: 模拟实现: 2. memmove EX: ​编辑 模拟实现: 3. memcmp EX: PS: 模拟实现: 4. memset EX: 模拟实现: 1. m ...

最新文章

  1. 【Python基础】11、文本处理与IO深入理解
  2. String类型的学习
  3. unitywebrequest本地加载_Unity AudioSource加载本地.mp3文件/UnityWebRequest
  4. 安全网关之三:IPTables
  5. 【Java从0到架构师】MyBatis - 连接池、分页_PageHelper
  6. laravel application 容器app
  7. 蓝桥杯 BASIC-10 基础练习 十进制转十六进制
  8. #低码系列#如何设计一个低代码平台?
  9. 移动硬盘打不开怎么办?
  10. python 日本 地图 热力图_python 在百度地图上画热力图
  11. 免费的顶级域名要在哪申请?
  12. java http put请求方式_HttpClient HTTP PUT请求方法示例
  13. STM32的ETR引脚计数功能
  14. 51系列、arduino、stm32系列驱动DAC模块TLC5615输出指定电压(可修改为波形输出)
  15. PCL-ICP(IterativeClosestPoint)源码解析
  16. 形式化方法-- petri net
  17. (论文笔记)An Attention Enhanced Graph Convolutional LSTM Network for Skeleton-Based Action Recognition
  18. Type com.xxx.xxx.BuildConfig is defined multiple times:...
  19. PT100三线制恒流源接法
  20. 用计算机弹c哩c哩数字,C哩C哩 - 在线打字测试(dazi.kukuw.com)

热门文章

  1. 关于抽象类中的抽象方法和非抽象方法的问题
  2. 关于颜色HSL(色度、饱和度、亮度)
  3. python一句代码生成26个英文字母
  4. Dubbo-02 20190315
  5. linux沙盒程序,沙盒应用程序如何?
  6. 十九、顺序查找法和折半查找法
  7. 微信小程序实现运动步数排行(可删除)
  8. 批处理框架 Spring Batch 这么强,你会用吗?
  9. Linux Performance Analysis and Tools(Linux性能分析和工具)
  10. 关于生产环境跨域问题