C语言内存函数(与上篇字符函数及字符串函数一起食用效果更佳哦~)

顾名思义,内存函数就是针对内存块(即一块内存)来处理的。

因此本篇所讲的四种内存函数:

  1. memcpy(内存拷贝)
  2. memmove(内存移动)
  3. memset(内存设置)
  4. memcmp(内存比较)

都是通过对内存块的操作处理来实现其功能的。

注:以下内存函数都需要包含头文件<string.h>

1.memcpy函数的使用和模拟实现

memcpy函数的使用:

我们首先通过它的函数名来对它进行一定的理解

因此memcpy可以译为内存拷贝,可以参考作者的上篇博客http://t.csdnimg.cn/JHXyG中对strcpy函数的讲解来帮助理解memcpy函数。

函数的形式如下图:

第一个参数destination存放的是目标空间的地址

第二个参数source存放的是源空间的地址

函数的作用是从source的地址开始向后复制num(即第三个参数)个字节的数据到destination指向的内存位置,返回的是目标空间的起始地址。

可以看到,数据类型都为void*,这是因为内存函数是对内存进行操作的,内存可以存放各种类型的数据,而void*指针可接收任意空间的地址。

那么具体应该如何操作呢?如图:

由上图可以知道,memcpy是以字节为单位进行拷贝的,而第三个参数告诉我们要拷贝的字节数,因此它并不会同strcpy函数一样遇到\0停下来,而是我们让它拷贝多少就拷贝多少。

memcpy函数的模拟实现:

思路:将源空间(即第二个参数)的地址逐字节赋给目标空间(即第一个参数的地址),每赋完一个字节后两个空间的地址向后增加一字节,再赋值,直到赋完num个字节为止。

代码实现如下:



一般情况下memcpy函数的使用及模拟实现我们已经完成,但如果我们此时想将arr1中的“3,4,5”拷给arr2而是想将arr1中的1,2,3,4,5拷贝到arr1中的3,4,5, 6, 7呢?如图:

如果有细心的小伙伴可能会发现这里有问题,(注意,此时源空间和目标空间是同一块内存)当我们目标空间的3,4分别被源空间的1,2拷贝后,此时arr1中的内存分布如图:接着拷贝下去我们发现会一直进行1,2的循环拷贝,显然不是我们所希望的结果,因此memory函数不负责重叠的拷贝。那这种情况我们该怎么办呢?这就引出来了我们要学习的下一个内存函数——memmove

2.memmove函数的使用和模拟实现

memmove函数的使用:

由上文我们知道memcpy不负责重叠的拷贝,因此当目标空间和源空间有重叠时,我们可以使用memmove函数进行拷贝.

memmove函数的形式如下:

跟memcpy类似,memmove函数的第一个参数为目标空间,第二个参数为源空间,num为拷贝的字节数,返回的是目标空间的地址。作用也是将源空间的num个字节的地址复制拷贝到目标空间。只不过它是可以拷贝重叠的空间的。

使用效果如图:

可以正常将重叠的空间进行拷贝。

memmove函数的模拟实现:

首先我们要想想,当空间重叠时,函数是怎么进行拷贝的呢?

如图,此时目标空间(dest)的起始地址 > 源空间(source)的起始地址

我们可以将其倒着拷贝。

而当目标空间的起始地址 < 源空间的起始地址时:

我们可以将其从前往后拷贝。

而当目标空间和源空间没有重叠时从前☞后/从后☞前就都可以了

因此memmove函数的模拟实现代码如下:

void* my_memmove(void* dest, void* source, size_t num)
{
	void* p = dest;

	if (dest < source)//此时目标空间的起始地址<源空间的起始地址,从前☞后拷贝
	{
		while (num--)
		{
			*(char*)dest = *(char*)source;
			dest = (char*)dest + 1;
			source = (char*)source + 1;
		}
	}

	else//从后☞前拷贝
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)source + num);
		}
	}

	return p;
}

3.memset (内存设置)函数的使用

函数形式如下:

如图,第一个参数(ptr)为我们要设置的内存

          第二个参数(value)是我们想要的内容

          第三个参数(num)为我们要改变的字节数

因此,memset是用来设置内存的,将内存中的值以字节为单位设置成我们想要的内容

示例如下:

4.memcmp(内存比较)函数的使用 

memcmp函数的学习可以参考http://t.csdnimg.cn/vsA0n中的strcmp函数

memcmp函数形式如下:

作用:比较ptr1和ptr2指针指向的位置开始的向后num个字节

返回值如下:

既然我们已经知道了memcmp函数的作用,那就开始实操了,代码实现如下:当前num个字节相等时返回0。

当arr1<arr2时返回<0的数字

当arr1>arr2时返回>0的数字



完结撒花~

创作不易,来个三连支持一下吧亲🌹🌹~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

批量复制文件智能删除已复制,轻松管理文件新体验!让您的文件整理更高效无忧

在信息爆炸的时代&#xff0c;文件管理无疑成为我们日常生活和工作中不可或缺的一部分。面对堆积如山的文件&#xff0c;我们时常陷入无尽的复制、粘贴、删除循环中&#xff0c;不仅耗时耗力&#xff0c;还容易出错。但今天&#xff0c;我要向您推荐一款颠覆传统的文件管理工具…

移动云——让每个人都能享受云技术的魅力

一、引言 云技术的起源可以追溯到20世纪60年代和70年代&#xff0c;随着科技的发展&#xff0c;现在早就和所有人息息相关。在云技术的浪潮中&#xff0c;有这么一家厂商通过自己的努力&#xff0c;深耕云计算市场&#xff0c;不仅有各种各样的产品为开发者提供服务&#xff0…

基于vue3速学angular

因为工作原因&#xff0c;需要接手新的项目&#xff0c;新的项目是angular框架的&#xff0c;自学下和vue3的区别&#xff0c;写篇博客记录下&#xff1a; 参考&#xff1a;https://zhuanlan.zhihu.com/p/546843290?utm_id0 1.结构上&#xff1a; vue3:一个vue文件&#xff…

【simple-admin】simple-admin-core 首次服务启动 如何配置mysql数据库表 | 如何docker启动core

一、下载启动S-A 1、下载源码 https://github.com/suyuan32/simple-admin-core.git git clone https://github.com/suyuan32/simple-admin-core.git2、修改etc下yaml配置 需要对RPC和API 分别2个文件夹下的etc下的yaml进行修改 替换成我们的数据库 3、初始化数据库 核心代…

JavaEE之线程(9) _定时器的实现代码

前言 定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”。 达到一个设定的时间之后&#xff0c;就执行某个指定好的代码&#xff0c;比如&#xff1a; 在受上述场景中&#xff0c;当客户端发出去请求之后&#xff0c; 就要等待响应&#xff0c;如果服务器迟迟没有响应&…

YOLOv10最全使用教程(含ONNX和TensorRT推理)

论文题目&#xff1a;YOLOv10: Real-Time End-to-End Object Detection 研究单位&#xff1a;清华大学 论文链接&#xff1a;http://arxiv.org/abs/2405.14458 代码链接&#xff1a;https://github.com/THU-MIG/yolov10 作者提供的模型性能评价图&#xff0c;如下&#xff1a;…

基于灰狼优化算法优化RBF(GWO-RBF)的数据回归预测(多输入多输出)

代码原理及流程 基于灰狼优化算法优化多输入多输出&#xff08;MIMO&#xff09;的RBF神经网络的数据回归预测&#xff0c;可以采取以下步骤&#xff1a; 1. 数据准备&#xff1a;准备包含多个输入特征和多个输出目标的数据集&#xff0c;确保数据已经经过预处理和归一化。 …

盲人社区生活支持体系:织就一张温暖的网

在当今社会&#xff0c;构建一个全面、包容的盲人社区生活支持体系成为了推动社会进步、保障残障人士权益的重要议题。随着科技的不断革新&#xff0c;一款名为“蝙蝠避障”的辅助软件走进了盲人的日常生活&#xff0c;它如同一位无形的向导&#xff0c;通过实时避障与拍照识别…

Failed to load property source from location ‘classpath:/application.yml‘

总帮客户二开 经常会遇到这种问题 网上的解决办法都是刷新maven (对我没用&#xff01;) 我的解决办法是修改编码&#xff01;

PLSQL连接Linux Oracle21c

PLSQL连接Linux Oracle21c 一、安装PLsql 下载官网 https://www.allroundautomations.com/registered-plsqldev/ 二、Oracle Instant Client下载 使用plsql连接oracle的时候是需要本地先安装oracle客户端&#xff0c;英文名就是Oracle Instant Client。 官方下载地址&…

初识java——javaSE (6)接口的实现——比较器与深拷贝,浅拷贝

文章目录 前言一 比较器1.1 关于两个对象的比较1.2 Comparable接口&#xff1a;1.3 Arrays.sort方法的实现1.4 比较器的实现Comparator接口 二 深拷贝与浅拷贝2.1 浅拷贝&#xff1a;Cloneable接口&#xff1a;clone方法&#xff1a;实现拷贝&#xff1a;浅拷贝&#xff1a; 2.…

【C++】list容器

目录 一.list容器介绍 二.C中list的基本组成 三.list容器相关接口的模拟实现 1.push_back() 2.迭代器的begin()和end() 3.insert() 4.erase() 5.pop_front() 6.pop_back() 7.size() 8.empty() 9.析构~list()和清除数据clear() 10.拷贝构造 11.赋值运算 四.模拟…

分享几张漂亮的linux kde主题

分享几张漂亮的linux kde主题&#xff1a;在系统设置的全局主题内下载。

SpringBoot——整合Redis

目录 Redis 创建Commodity表 启动MySQL和Redis 新建一个SpringBoot项目 pom.xml application.properties Commodity实体类 ComMapper接口 ComService业务层接口 ComServiceImpl业务接口的实现类 ComController控制器 RedisConfig配置类 SpringbootRdisApplication启…

c++|多态

c|多态 1 多态的概念2 多态的定义及其实现2.1 满足多态的条件2.2 虚函数2.3 虚函数的重写2.4 析构函数适合加virtural吗2.4 C11 override 和 final2.5 三个概念的对比 3 多态的原理4 抽象类4.1 概念4.2 纯虚函数 1 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是…

微信小程序实现容器图片流式布局功能,配合小程序原生框架使用。

小程序实现容器图片流式布局功能&#xff0c;因为目前论坛上也有很多博主出过类似的文章&#xff0c;这里我就以一个小白角度去讲一下如何实现的吧。给作者一点点鼓励&#xff0c;先点个赞赞吧&#x1f44d;&#xff0c;蟹蟹&#xff01;&#xff01; 目标 实现下方效果图 技术…

HarmonyOS鸿蒙应用开发——安装与配置

今天脑子又抽风&#xff0c;前端转完学后端之后&#xff0c;今天大周末早上醒来突然又想学鸿蒙了&#xff0c;刚好有个比赛需要用到鸿蒙&#xff0c;于是乎我就随便点开b站看了一下鸿蒙视频&#xff0c;然后马上来写这篇博客&#xff0c;后续我的鸿蒙的博客可能会跳着、不连续地…

springboot集成达梦数据库8

springboot集成达梦数据库8 官方文档&#xff1a;[https://eco.dameng.com/document/dm/zh-cn/start/java-development.html](https://eco.dameng.com/document/dm/zh-cn/start/java-development.html) 引入maven依赖 <!--添加数据库驱动安装包--> <dependency> …

十六进制转十进制

十六进制转十进制 在玩编程的时候常会碰到十六进制转换的问题。对于专业的大佬大咖这不是问题&#xff0c;小人物总会有些麻烦。我在研究调色板时也遇到进制转换问题。前些时在本站发了十进制转十六进制的博文&#xff0c;今再写十六进制转十进制的转换方法。供大家参考。 下面…

awk编辑器

目录 工作原理 命令格式 普通格式 BEGIN格式 语句循环格式 awk常见的内建变量&#xff08;可直接用&#xff09; 按行打印行内容 统计行数量 按字段输出文本 通过管道、双引号调用 Shell 命令 awk编辑器是一种流编辑器 工作原理 逐行读取文本,默认以空格或tab键为分…