前言

一、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. Linux下利用backtrace追踪函数调用堆栈以及定位段错误【转】
  2. 1001 A+B Format (20 分)【难度: 简单 / 知识点: 模拟】
  3. tensorflow中的交叉熵损失
  4. hadoop-02-关闭防火墙
  5. 译文丨伯克利对serverless的看法:简化云编程
  6. 怎么查看进程窗口_结束员工电脑进程/活动窗口的软件
  7. HTML文件点放在手机桌面,如何把手机桌面上的文件发送到微信里
  8. html的版本适配,2.1.3 HTML 5确保了与之前HTML版本的兼容性
  9. 斐讯盒子t1 刷Android,T1刷机的详细步骤
  10. socks5协议(rfc1928)
  11. c语言pow函数原型_c语言pow的用法
  12. php懂erp是什么意思,ERP是个什么鬼,这里的讲解通俗易懂
  13. 1033,2052 是什么意思?
  14. (C语言设计系统)利用EasyX完成学校工资管理系统
  15. 刘同——谁的青春不迷茫,给你冬日满满正能量
  16. 2020阿里云服务器购买攻略-618年中大促专场
  17. CephFS 介绍及使用经验分享
  18. php左测导航栏,商城左侧大分类导航菜单教程完整代码
  19. 可以将matlab安装到u盘吗,如何进行微软的office和matlab以及word等软件导入u盘
  20. 编程算法基础-常数变易法

热门文章

  1. Web前端——jQuery库
  2. 股票投资 策略(收集)
  3. C++实验题8 数组使用(bushi)
  4. C#基础知识点个人整理【菜鸟教程】
  5. 计算机收藏夹位于哪个磁盘,电脑浏览器收藏夹保存在哪里
  6. [Java]Java文件读写
  7. 我真希望有人在我学计算机之前,就告诉了我这100多个程序员学习网站!【全编程人员都可以看】
  8. 悬赏 50 XIN token 诚征 C# 区块链 SDK
  9. Apache Dubbo基本使用
  10. 类似qq新闻提示窗口样码(cpy)