(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)...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...