c/c++内存操作函数

函数原型

void*  memcpy(  void* _Dst,  void const* _Src,  size_t     _Size);        // 内存拷贝

void*  memmove(  void* _Dst,  void const* _Src,  size_t     _Size);     // 内存移动

void*  memset(void*  _Dst, int    _Val, size_t _Size);                           //  内存设置
int memcmp(void const* _Buf1, void const* _Buf2, size_t   _Size)       //  内存比较

void*   memchr(void const* _Buf, int    _Val,  size_t      _MaxCount)   //  内存查找

概述 

这些函数在字符串操作函数的那一节提到的函数好像都是类似的。
区别在于,那块的函数主要用于操作字符串,这里的函数用于操作内存。简单来说就是可以操作任何类型,因为其参数接受的是void*类型的(任何类型的指针都可以隐式转换为void*类型的指针) 

如果你是要操作字符串,那么可以使用相应的字符串操作函数,如果是要操作别的类型,那么可以使用这里提到的函数。

函数使用

memcpy()   --  拷贝的内存不能重叠 

  • void*  memcpy(  void* _Dst,  void const* _Src,  size_t     _Size); 
    将src指向的位置的size个字节拷贝到dst指向的位置,返回一个指向dst空间的指针。

    例子:   int buffer[] = { 1,23,4,5,6 };
               int dst[20];
               memcpy(dst, buffer, 5 * sizeof(int));

例子中,我们将buffer所指空间的20字节(也就是5个整数,因为一个int占四个字节)拷贝到了dst所指向的空间。

我们通过第三个参数来指定内存拷贝多少个字节,如果我们指向拷贝1个整数,一个整数是4字节,那么我们在第三个参数传入4,这样就只会拷贝一个整数了。(建议使用sizeof来计算对应类型占有的字节数,比如: sizeof(int));

注意:
1.  拷贝的两个内存不能重叠。

2.  你需要保证dst指向的空间能够放得下你指定的拷贝的字节数,而且也应该保证指定的字节数不能超过src所拥有的字节数。

memmove()-- 拷贝的内存可以重叠 

  • void*  memmove(  void* _Dst,  void const* _Src,  size_t     _Size);
    memmove()函数的用法和memcpy()的用法基本是相同的,区别在于:   memmove()允许移动(拷贝)的内存有重叠,memcpy()不允许。

    例子: 删除字符串中的指定子串:
                char buffer[] = "abcdefgh";
                memmove(buffer+2,buffer+5,4);
                printf("%s\n", buffer);

例子中,我们要删除某个特定的子串,此处为cde,我们可以将e后面的字符串复制或者移动到c的位置,这样cde这个串就被覆盖了,所以函数中我们需要传入指向c位置的指指针,指向f位置的指针。

这两个都是字符指针,也就是说传入的都是buffer存放字符串的子串,但你细看会发现以c位置开始的子串明显包含以f位置开始的子串。所以我们操作的这两个子串出现位置重叠,所以我们使用memmove()来实现。
此时注意:  我们将f后面的字符移动到前面的时候,应该多移动一位,因为移动的是字符串,还有一个字符串结束符。-- 当然移动别的类型就不用考虑这个问题了

  • 因为mommove()通常无法使用某些机器所提供的特殊字节-字符串处理指令来实现,所以它可能比memcpy()要慢。

    所以,如果拷贝的内存存在重叠,那就使用memmove(),没有那么就使用memcpy()

memset() 

  •  void*  memset(void*  _Dst, int    _Val, size_t _Size); 
    此函数可以将一个空间的对应字节都设置为某个数值,返回一个指向dst对应空间的指针

    例:   int buffer[50];
            memset(buffer, 0, 50 * sizeof(int));

例子中,我们定义了一个50个元素的整形数组,我们要将其全部的元素设置为0,这样我们可以遍历这个数组一个一个设置。

当然,我们也可以选择使用memset()函数,将指定字节的位置设置成指定的值。

显然,使用memset()函数更加的方便。所以,上面我们将buffer所有的位置都设置为0。这也是memset()常用的场景:  将一块数组空间设置为特定的值。

为什么50*sizeof(int)就是全部的空间呢?
数组有50个整形数据,一个整形数据占有的字节数为4,我们使用sizeof(int)得到,所以50个整形占有的字节为50*sizeof(int),也就是全部数据。

注意:
1.   还是要注意,指定的字节数不能超过dst的空间字节数。

 memcmp()

  •  int memcmp(void const* _Buf1, void const* _Buf2, size_t   _Size) 
    用于比较对应字节的两份数据,返回比较结果: 如果buf1<buf2返回-1,buf1>buf2返回1,buf1=buf2返回0。

    例:  和strcmp的用法是类似的,只是这个函数可以比较任意类型
           int buf1[] = { 1,10,3 };
           int buf2[] = { 4,5,6 };
           int ret = memcmp(buf1, buf2, 3 * sizeof(int));   // 返回-1
           printf("%d\n", ret);   

从前往后比较,只要比较出结果就返回。虽然buf1的第二个数比buf2的大,但是在第一个数据的时候就已经比较出结果,所以直接返回了。

注意:
1.   还是要注意,指定的字节数不能超过dst的空间字节数。

memchr() -- 可用于查找某个正数是否存在与整形数组中

  •  void*   memchr(void const* _Buf, int    _Val,  size_t      _MaxCount) 
    此函数和strchr()的用法类似,只是可以指定字节数了,也可以找整数类型了,找到返回指向目标元素所在位置的指针,没有找到返回NULL。

    例:       int buf1[] = { 1,10,3 };
                int* ret = (int*)memchr(buf1, 10, 12);
               printf("%d\n", *ret);   // 输出10
     

注意:
1.   还是要注意,指定的字节数不能超过dst的空间字节数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS内购欺诈漏洞

iOS内购欺诈漏洞 1.iOS内购欺诈漏洞概述2.伪造的凭证3.漏洞修复方案 1.iOS内购欺诈漏洞概述 黑产别的App上低价充值&#xff08;比如1元&#xff09;换取苹果真实凭证&#xff0c;再在目标App上下单高价&#xff08;648元&#xff09;商品&#xff0c;传入该凭证&#xff0c;如…

操作系统 - 输入/输出(I/O)管理

输入/输出(I/O)管理 考纲内容 I/O管理基础 设备&#xff1a;设备的基本概念&#xff0c;设备的分类&#xff0c;I/O接口 I/O控制方式&#xff1a;轮询方式&#xff0c;中断方式&#xff0c;DMA方式 I/O软件层次结构&#xff1a;中断处理程序&#xff0c;驱动程序&#xff0c;…

代码随想录算法训练营第四天| 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

24.两两交换链表中的节点 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 解题思路 很麻烦的一道题目&#xff0c;不是很理解。还是看视频文章才AC的。 解法1 …

一些硬件知识【九】

STM32CUBEMX配置教程&#xff08;六&#xff09;高级定时器单通道输出互补PWM波&#xff08;带死区和刹车&#xff09;_高级定时器死区刹车怎么与电机模块连接?-CSDN博客 MOS选型关键参数&#xff1a; 额定电压&#xff0c;额定电流&#xff0c;导通电阻&#xff0c;阀值电压…

新型高性能数据记录仪ETHOS 2

| 具有强大CPU性能的数据记录仪 IPETRONIK推出了一款新型高性能数据记录仪——ETHOS 2&#xff0c;作为ETHOS的第二代&#xff0c;它借助新型英特尔i7-9850HE处理器&#xff0c;实现了11,572的性能指数&#xff0c;从而能够快速有效应对CAN FD、LIN和以太网总线测量方面的日益…

Double数据精度导致的问题

早知道double的数据精度有限&#xff0c;所以在计算金钱等精细数据的时候&#xff0c;要用bigdecimal&#xff1b; 但是最近在计算一些客流量数据数据的时候&#xff0c;也发现&#xff0c;这种数据精度不足的情况&#xff0c;会不仅仅导致小数点级的计算结果出错 实在是&#…

假暴力,cf1168B. Good Triple

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1168B - Codeforces 二、解题报告 1、思路分析 一眼没思路&#xff0c;打个暴力试试 因为如果 s[l, r] 是一个好字符串&#xff0c;那么s[i, r]一定也是好字符串&#xff0c;其中i < l 那么…

【生产管理】生产过程中的常见问题及解决方案

在生产管理中&#xff0c;会遇到多种问题&#xff0c;特别是与生产计划、生产进度控制以及品质控制方面&#xff0c;以下是生产过程中常见的问题及解决方案&#xff1a; 问题一&#xff1a;计划不清或无计划导致的物料进度无法保障 解决方案&#xff1a; 建立详细的生产计划&…

webserver服务器从零搭建到上线(八)|EpollPoller事件分发器类

文章目录 EpollPoller事件分发器类成员变量和成员函数解释私有的成员函数和成员变量成员函数 具体实现常量的作用构造函数和析构函数⭐️poll函数updateChannel函数removeChannel 函数removeChannel 和updateChannel⭐️fillActiveChannels 函数⭐️update 函数 总结 终于要开始…

[数据集][目标检测]喝水检测数据集VOC+YOLO格式995张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;995 标注数量(xml文件个数)&#xff1a;995 标注数量(txt文件个数)&#xff1a;995 标注类别…

jeecgboot 同一账号只允许一个人登录

1.需求分析 jeecgboot 框架要实现同一个账号只允许一个人登录&#xff0c;就跟游戏账号类似&#xff0c;“我登录了就把你踢下去&#xff0c;你登录了就把我踢下去”&#xff1b;jwt 原理是生成 token 后一段时间内登录都有效&#xff0c;jeecgboot 中 jwt 和 redis 联合使用后…

OpenCV学习(2.1) 初识图像

1.图像对象 图像是由一个个像素组成的&#xff0c;像素越多&#xff0c;体现到图像就是更加清晰&#xff0c;有更多的细节。举个例子&#xff0c;通常来说的分辨率&#xff0c;1080P&#xff0c;720P&#xff0c;480P就是指像素的数量&#xff0c;数量越多就越清晰。 2.打印图…

第四周:心态和角色

1. 关注自己到关注他人 关注自己到关注他人&#xff0c;就是利己到利他&#xff0c;基本上就是从全局的角度去看待事情&#xff0c;而不单单是自己一亩三分地里耕耘&#xff0c;团队出的任何事情&#xff0c;首要责任就在管理者身上&#xff0c;不再是单打独斗了&#xff0c;你…

在LINQ中,如何使用Include方法加载关联的实体或集合?

Include 方法允许你在查询数据时一并加载关联的实体或集合。这有助于减少数据库访问次数&#xff0c;因为你可以一次性获取所有需要的数据&#xff0c;而不是分别查询每个关联的实体。 一、以下是如何在 Entity Framework 中使用 Include 方法来加载关联实体或集合的步骤&…

NV-LIO:一种基于法向量的激光雷达-惯性系统(LIO)

论文&#xff1a;NV-LIO: LiDAR-Inertial Odometry using Normal Vectors Towards Robust SLAM in Multifloor Environments 作者&#xff1a;Dongha Chung, Jinwhan Kim NV-LIO&#xff1a;一种基于法向量的激光雷达-惯性系统&#xff08;LIO&#xff09;NV-LIO利用从激光雷…

vue3主题切换按钮与功能实现

代码: <template><div class"slideThree"><label class"theme-switch"><inputtype"checkbox"class"checkbox"v-model"isChecked"change"setTheme"id"slideThree"name"check…

Day08:CSS 高级

目标&#xff1a;掌握定位的作用及特点&#xff1b;掌握 CSS 高级技巧 一、定位 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 leftrighttopbottom 水平方向偏移&#xff1a;left、…

mac下载安装好软件后提示已损坏

mac下载安装好软件后提示已损坏 解决方法&#xff1a; 首先确保系统安全设置已经改为任何来源。 打开任何来源后&#xff0c;到应用程序目录中尝试运行软件&#xff0c;如果仍提示损坏&#xff0c;请在应用图标上&#xff0c;鼠标右键&#xff0c;在弹出菜单中点打开。 如果…

埃及媒体分发投放-新闻媒体通稿发布

埃及商业新闻 大舍传媒近日宣布将在埃及商业新闻领域展开新的媒体分发投放。作为埃及最具影响力的商业新闻平台之一&#xff0c;埃及商业新闻将为大舍传媒提供广阔的市场和受众群体。这一合作意味着大舍传媒将有机会通过埃及商业新闻的平台向埃及的商业精英和投资者传递最新的…