(c语言进阶)内存函数
一.memcpy(void* dest,void* src,int num) ,操作单位为字节,完成复制且粘贴字符串
1.应用
#include <stdio.h>
#include<string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };memcpy(arr2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2int i = 0;for (i = 0; i < 5; i++){printf("%d ", arr2[i]);}return 0;
}
2.模拟实现
#include <stdio.h>
#include<string.h>
#include<assert.h>
//因为该函数需要能操控任意类型的数据,故不能将参数设定为固定类型
//而void类型可以接收任意类型的值
void* my_memcpy(void* arr2,const void* arr1,int x)//将arr1中的元素拷贝给arr2
{assert(arr1&&arr2); //不能为空指针void* ret = arr2; //保存被赋值数组的首地址while (x--){*(char*)arr2 = *(char*)arr1; //void*类型无法解引用,需要转换为其他类型arr1 = (char*)arr1 + 1; //转化为char*类型,可每次只改变一个字节,可适用于任何类型arr2 = (char*)arr2 + 1;}return ret; //返回被赋值数组的首地址
}
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };my_memcpy(arr2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2int i = 0;for (i = 0; i < 5; i++){printf("%d ", arr2[i]);}return 0;
}
3.重点——memcpy()可以处理,但不用来处理重叠内存之间的数据拷贝(这种问题统一交给memmove函数——分工明确)
#include <stdio.h>
#include<string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };memcpy(arr1+2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2int i = 0;for (i = 0; i < 5; i++){printf("%d ", arr2[i]);}return 0;
}

二.memmove(void* dest,void* src,int num) ——解决重叠内存之间的数据拷贝
1.应用
#include <stdio.h>
#include<string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };memmove(arr1 + 2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2int i = 0;for (i = 0; i < 5; i++){printf("%d ", arr1[i]);}return 0;
}

2.模拟实现

#include <stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* arr2 ,void* arr1, int x)//将arr1中的元素拷贝给arr2
{void* p = arr2;assert(arr2&&arr1);if (arr2 <= arr1){while (x--){*(char*)arr2 =*(char*)arr1;arr1=(char*)arr1+1;arr2=(char*)arr2+1;}}else{while (x--){*((char*)arr2 + x) = *((char*)arr1+x); //将指针指向需要赋值的空间最后-1,每次向前读取一个字节}}return p; //返回被拷贝的数组首地址
}
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };my_memmove(arr1 + 2, arr1, 28);//从arr1中读取20个字节,将其复制给arr1+2int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

三.memcmp()——内存比较函数,比较单位为字节,可以比较任意类型的元素
1.应用
#include<stdio.h>
#include<string.h>
int main()
{int arr1[] = { 1,2,3,4,5}; //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00int arr2[20] = { 1,3,2 }; //01 00 00 00 03 00 00 00 02 00 00 00int ret = memcmp(arr1,arr2,12);//比较两个数组中前12个字节//arr1>arr2返回值为正整数,arr1=arr2返回值为0,arr1<arr2返回值为负整数printf("%d",ret);return 0;
}

2.模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_memcmp(void* arr1, void* arr2, int x)
{assert(arr1 && arr2);while (*(char*)arr1 == *(char*)arr2) //相同的情况下,判断下一位是否也相同,不相同则退出循环{if (x==0) //若有其中一个字符串到达末尾,则退出循环{break;}arr1=(char*)arr1+1;arr2=(char*)arr2+1;x--;}return *(char*)arr1 - *(char*)arr2; //不相同则相减返回差值
}
int main()
{int arr1[] = { 1,2,3,4,5}; //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00int arr2[20] = { 1,3,3 }; //01 00 00 00 03 00 00 00 02 00 00 00int ret = my_memcmp(arr1,arr2,12);//比较两个数组中前12个字节//arr1>arr2返回值为正整数,arr1=arr2返回值为0,arr1<arr2返回值为负整数printf("%d",ret);return 0;
}

四.memset()——内存初始化(初始化变量为整形或字符型)
1.应用
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "hello bit";memset(arr,'x',5); //将arr地址后五个字节的内存初始化为‘x’printf("%s",arr);return 0;
}

2.模拟实现
#include<stdio.h>
#include<string.h>
void* my_memset(void* arr, int value, int x)
{void* p = arr;while (x--){*(char*)arr = value;arr=(char*)arr + 1;}return p;
}
int main()
{char arr[] = "hello bit";my_memset(arr+6,'1',3);printf("%s",arr);return 0;
}

相关文章:
(c语言进阶)内存函数
一.memcpy(void* dest,void* src,int num) ,操作单位为字节,完成复制且粘贴字符串 1.应用 #include <stdio.h> #include<string.h> int main() {int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] { 0 };memcpy(arr2, arr1, 20);//从…...
【2023春李宏毅机器学习】快速了解机器学习基本原理
文章目录 机器学习约等于机器自动找一个函数 机器学习分类 regression:输出为连续值classification:输出为一个类别structured learning:又叫生成式学习generative learning 生成有结构的物件(如:影像、句子…...
人工智能:科技的魔术师
引言: 人工智能(Artificial Intelligence,简称AI)作为一项前沿技术,正以惊人的速度改变着我们的生活。它像魔术师一样,能够解决我们的问题、提供建议,甚至预测未来。从智能手机到智能家居&…...
三菱FX3U小项目—运料小车自动化
目录 一、项目描述 二、IO口分配 三、项目流程图 四、项目程序 五、总结 一、项目描述 设备如下图所示,其中启动按钮SB1用来开启运料小车,停止按钮SB2用来手动停止运料小车(其工作方式任务模式要求)。当小车在原点SQ1位置,按下启动按钮S…...
智慧城市大脑数据中台解决方案:PPT全套37页,附下载
关键词:智慧城市大脑解决方案,数据中台解决方案,智慧城市建设,数据中台建设,智慧城市大脑建设,数据中台建设架构 一、智慧城市大脑数据中台建设背景 智慧城市大脑数据中台是一个面向城市级数据管理、开发和…...
vs code git问题:文件明明已加入忽略文件中,还是出现
vs code git问题:文件明明已加入忽略文件中,还是出现 原因: 因为之前这些文件都已经提交过,线上GIT已经存在,已存在就不能忽略, 解决办法: 先要删除这些文件提交上去,然后把这些文…...
打不开github网页解决方法
问题: 1、composer更新包总是失败 2、github打不开,访问不了 解决方法:下载一个Watt Toolkit工具,勾选上,一键加速就可以打开了。 下载步骤: 1、打开网址: Watt Toolkit 2、点击【下载wind…...
【预处理详解】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作用的宏参数 5. 宏替换的规则 6. 宏函数的对比 7. #和## 7.1 #运算符 7.2 ## 运算符 8. 命名约定 …...
BetterDisplay Pro v2.0.11(显示器颜色校准软件)
BetterDisplay Pro是一款为Mac电脑设计的屏幕亮度调节软件,旨在提高显示器的色彩和亮度表现。它可以根据用户的需求和显示器的特性,自动调整显示器的亮度、色温、对比度等参数,以获得更加真实、舒适的视觉效果。 这款软件拥有智能调节功能&a…...
APP外包开发需要注意的问题
在进行APP外包开发时,有一些关键问题需要注意,以确保项目的顺利进行和最终交付满足预期的应用。以下是一些在APP外包开发中需要关注的问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎…...
Wireshark TS | 应用传输缓慢问题
问题背景 沿用之前文章的开头说明,应用传输慢是一种比较常见的问题,慢在哪,为什么慢,有时候光从网络数据包分析方面很难回答的一清二楚,毕竟不同的技术方向专业性太强,全栈大佬只能仰望,而我们…...
邦芒支招:求职自荐的五条技巧
求职自荐的技巧有哪些,在职场中,求职是很讲究技巧的,因为每个人都想自己的在面试的时候能取得好的结果,那么求职自荐的技巧有哪些呢?下面就跟小邦一起来了解一下吧。 第一、要积极主动。求职自荐是求职者的…...
受电诱骗快充取电芯片XSP08:PD+QC+华为+三星多种协议9V12V15V20V
目前市面上很多家的快充充电器,都有自己的私有快充协议,如PD协议、QC协议、华为快充协议、三星快充协议、OPPO快充协议等待,为了让它们都能输出快充电压,就需要在受电端也增加快充协议取电芯片XSP08,它可以和充电器通讯…...
课程32:.Net Core Web API部署IIS
这里写目录标题 🚀前言前言一、服务器环境配置1.1 安装 ASP.NET Core模块/托管捆绑包1.2 检查是否安装成功二、项目发布2.1 选择发布方式2.2 发布配置2.3 发布三、服务器部署3.1 IIS添加网站3.2 数据库链接配置3.3 让IIS支持.NET Web Api3.4 验证四、最后🚀前言 本文是《.…...
wpf devexpress 绑定数据编辑器
定义视图模型 打开前一个项目 打开RegistrationViewModel.cs文件添加如下属性到RegistrationViewModel类 [POCOViewModel] public class RegistrationViewModel {public static RegistrationViewModel Create() {return ViewModelSource.Create(() > new RegistrationVie…...
状态模式-
定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 适用场景: 1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 2、条件、分支语句的代替者,且这些分支依赖于该对象…...
人机交互——自然语言生成
自然语言生成是让计算机自动或半自动地生成自然语言的文本。这个领域涉及到自然语言处理、语言学、计算机科学等多个领域的知识。 1.简介 自然语言生成系统可以分为基于规则的方法和基于统计的方法两大类。基于规则的方法主要依靠专家知识库和语言学规则来生成文本࿰…...
软考-高级-系统架构设计师教程(清华第2版)【第18章 安全架构设计理论与实践(P648~690)-思维导图】
软考-高级-系统架构设计师教程(清华第2版)【第18章 安全架构设计理论与实践(P648~690)-思维导图】 课本里章节里所有蓝色字体的思维导图...
Hive调优
1.参数配置优化 设定Hive参数有三种方式: (1)配置Hive文件 当修改配置Hive文件的设定后,对本机启动的所有Hive进程都有效,因此配置是全局性的。 一般地,Hive的配置文件包括两部分: aÿ…...
基于R语言平台Biomod2模型的物种分布建模与可视化分析
!](https://img-blog.csdnimg.cn/84e1cc8c7f9b4b6ab60903ffa17d82f0.jpeg#pic_center)...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
