首页 > 系统相关 >C语言内存函数之 memcpy和memmove函数

C语言内存函数之 memcpy和memmove函数

时间:2024-03-21 23:31:43浏览次数:22  
标签:arr 函数 memmove void brr memcpy

memcpy函数的记忆方法:mem表示内存类函数,属于头文件string.h里面的函数。cpy是copy的缩写,表示对内存数据进行拷贝。

memcpy函数的输入值和返回值:void*  my_memcpy(void*brr,void*arr,size_t v)  memcpy的输入值分别是被拷贝数据的brr的无类型数组的首地址,然后是拷贝给别人的无类型数组的首地址arr,最后是size_t类型的需要拷贝的字节数v。

memcpy函数的自我实现:

void*  my_memcpy(void*brr,void*arr,size_t v){
    for (int x = 0; x < v; x++) {     //用v来限制x的自增大小最值,x来确定拷贝的地方
        *((char*)brr + x) = *((char*)arr + x);  //用强制类型转换来一个字节一个字节的拷贝,以char类                                                                     型来强制类型转换刚好可以一个字节一个字节的搬运内                                                                      存数据。
    }
    return brr;                                 //最后返回无类型的地址brr,所以接受的时候注意强制类型转换
}

memmove函数的记忆方法:mem表示内存类函数,属于头文件string.h里面的函数。move表示搬运,和拷贝的意思是差不多的,但是它复制的方向和memcpy不同。

memmove函数的传入值和返回值:void* my_memmove(void* brr, void* arr, size_t v)

这里 和strcpy函数是相同的。

memmove函数的自我实现:

void* my_memmove(void* brr, void* arr, size_t v) {
    for (int x = v - 1; x >= 0; x--) {   //这里就是把赋值的顺序反过来了
        *((char*)brr + x) = *((char*)arr + x);
    }
    return brr;
}
 

为什么要这么能呢?

肯定有其原因:

如果现在你要把123向后移动两位,你要怎么做呢?如果你是把1先放在3处,再把2放在4处,你要移动3发现你的3被1覆盖了。所以这里就可以看出我们从前向后复制是不能用memcpy的。那么我们用memmove呢,先移动3到5,再移动2到4,再是1到3。发现完全没有问题。那么如果我们把3 4 5向前移动2位能不能用memmove呢,答案是不行的,你们可以自行试一试。这里就要相反来搞了,用memcpy。

那么我们能不能自己设定一个函数来将两个函数的功能结合起来呢?

当然是可以的。我们观察上面两种情况,发现就是一个在前一个在后的问题,在前的如果复制到后面去就要先从后面赋值。反之就应该前面的先复制到前面去。

代码实现:

做一个判断就行了。

标签:arr,函数,memmove,void,brr,memcpy
From: https://blog.csdn.net/2301_80772499/article/details/136921017

相关文章

  • 循环控制:(第10题)与闰年相关的问题,涉及数组,函数的知识
    #include<stdio.h>intis_leap_year(intyear){ if((year%4==0&&year%100!=0)||year%400==0) return1; else return0;}intgap_years(intyear){ inti=1990; intsum=0; intgap_years=0; if(year==1990) retur......
  • QT增加线程函数步骤流程
    在使用线程的时候,不仅要关注线程开启的时机,同时还要关注线程安全退出,这样才能保证程序的健壮性,如果线程开启的较多,且开启关闭比较频繁,建议使用线程池来处理。开启线程有三种方式:第一种C++的开线程方式;第二种自定义一个继承自QObject的类,把要处理的事情放在这个类中实现,然后再ne......
  • QT自定义带参数信号与槽函数
            我的软件界面是这样的,点击图标按钮后进入子项的参数配置。    由于按钮众多,每个按钮都有点击事件,一个个去写是在太多麻烦,而且我的这个配置软件各个子项的参数配置页面基本是差不多的,只是传递的参数有差异而已。    通过自定义一个信号,用于......
  • Oracle函数7—日期函数(sysdate 、to_date、add_months、last_day......)
    文章目录1、日期获取(sysdate、current_date)2、设置时间格式(to_date、to_char)3、两个日期的差(直接加减)4、月份加减(add_months)5、取某月最后一天(last_day)6、两个日期相差月份数(months_between)7、获取下个周几是几号(next_day)8、获取指定时间的年或月或日(extract)9、时间的四......
  • 前端基础之JavaScript函数
    一、什么是函数在JavaScript中,函数是一种可重复使用的代码块,用于执行特定任务或计算。函数可以接受参数,执行特定的操作,并返回一个值。二、函数的声明函数可以通过函数声明、函数表达式或箭头函数来定义。函数声明:functionfunctionName(parameters){//函数体......
  • C++ 纯虚函数
    纯虚函数优点防止派生类忘记实现虚函数,纯虚函数使得派生类必须实现基类的虚函数。在某些场景下,创建基类对象是不合理的,含有纯虚拟函数的类称为抽象类,它不能直接生成对象。声明方法:在基类中纯虚函数的方法的后面加=0。virtualvoidfuntion()=0;virtualstd::stringGetN......
  • SQL Server分页的内置函数
    SQLServer提供了几个内置函数来实现数据分页,以下是其中常用的函数:ROW_NUMBER():ROW_NUMBER()函数可以为结果集中的每一行添加一个序号,按照指定的排序方式进行排序。结合ROW_NUMBER()函数和WHERE子句,可以实现简单的分页效果。示例:SELECT*FROM(SELECT*,ROW_NUMBER()OV......
  • python 函数(解包、互相调用、作用域、函数的封装、内置函数:eval()、zip()、open())
    函数解包"""1、函数的注释:参数和返回值在注释里可以自动添加显示,只需手动加说明。2、函数的解包【拆包】:函数的参数要传递数据有多个值的时候,中间步骤拿到数据保存在元组或者列表或者字典里。-传递参数的时候加一个*或者**解包-一次拿到元组列表字典的......
  • C++ 合成默认构造函数
    问题:C++面向对象编程时,如果我们没有声明任何构造函数constructor,按照以前最初学习,说编译器会自动合成一个默认的无参构造函数defaultconstructor,但是事实确实是这样吗,存不存在例外呢,即使有合成构造函数,那么它又将对类数据进行怎样的初始化呢?1.问题一如果我们没有声明任何构造......
  • 复变函数,启动!计应数番外编~对冒险主义的姚发起华丽叛逆的说!!!
    \[\newcommand{\Arg}{\operatorname{Arg}}\newcommand{\i}{\mathbfi}\newcommand{\d}{\mathrmd}\newcommand{\p}{\part}\newcommand{\Ln}{\operatorname{Ln}}\newcommand{\Arccos}{\operatorname{Arccos}}\newcommand{\Arcsin}{\operatorname{A......