第十五讲:C语言内存函数

第十五讲:C语言内存函数

  • 1.memcpy函数的使用和模拟实现
    • 1.1函数原型
    • 1.2函数的使用
    • 1.3函数使用的注意事项
    • 1.4memcpy函数的模拟实现
  • 2.memmove函数的使用和模拟实现
    • 2.1函数原型
    • 2.2函数使用
      • 2.2.1使用函数处理整形数据
      • 2.2.2使用函数处理重叠类型(源空间和目标空间重叠)
    • 2.3memmove函数的模拟实现
  • 3.memset函数的使用
    • 3.1函数原型
    • 3.2函数使用注意事项
      • 3.2.1对于整形变量的设置
    • 3.3函数的具体使用
  • 4.memcmp函数的使用
    • 4.1函数原型
    • 4.2函数使用

这一讲所讲的全部都是C语言中的内存函数,与字符函数和字符串函数不同的是,该函数可以处理所有类型的数据(整形数据、浮点型数据)

总结:
1.可以改变目标空间的地址,决定拷贝位置(arr1+2)
2.可以改变源空间地址,决定从哪拷贝(arr2+2)
3.可以通过sizeof(arr[0])*2来决定复制几个字符

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

1.1函数原型

该函数负责将源内存块的count个字节复制到目标内存块上,包含在头文件<string.h>中

void *memcpy( void *dest, const void *src, size_t count );

参数:
1.dest:表示目标内存块地址
2.src:表示源内存块地址
3.count:表示要复制的字节数
返回值:
改函数返回的是目标内存块的起始指针

1.2函数的使用

//1.2函数的使用
int main()
{char arr1[20] = "xxxxxxxxx";char arr2[] = "abcdef";char* a1 = memcpy(arr1, arr2, 3);//abcxxxxxx//将arr2数组中的三个字节复制到arr数组中printf("a1 = %s\n", a1);char* a2 = memcpy(arr1, arr2+2, 3);//cdexxxxxx//当然,我们可以通过改变指针,来确定在哪进行复制printf("a2 = %s\n", a2);char* a3 = memcpy(arr1+2, arr2, 3);//我们还可以改变目标字符串的地址,但是memcpy函数返回的是目标字符串的地址printf("a3 = %s\n", a3);//abcxxxxprintf("arr = %s\n", arr1);//xxabcxxxxreturn 0;
}

1.3函数使用的注意事项

  • 该函数在遇到\0的时候并不会停止
  • 如果源字符串和目标字符串重叠,或者说他们指向一个数组时,复制的结果是未定义的,也就是说,memcpy函数只负责不同数组之间内存块的拷贝,同个数组中我们可以使用memmove函数

下面我们来讨论如果将源字符串和目标字符串重叠时,会发生什么:

//1.3函数使用的注意事项
int main()
{char arr1[20] = "abcdef";char* a1 = memcpy(arr1+1, arr1, 3);printf("a1 = %s\n", a1);//结果可能为aaaaefreturn 0;
}

这是因为每次复制都会改变目标字符串中的字符,影响后面的复制

1.4memcpy函数的模拟实现

//1.4memcpy函数的模拟实现
#include <assert.h>void* Mymemcpy(void* dest, const void* src, size_t count)
{char* start = dest;assert(dest && src);for (int i = 0; i < count; i++){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return start;
}//当然,除了使用for循环,我们还可以使用while循环
void* Mymemcpy1(void* dest, const void* src, size_t count)
{char* start = dest;assert(dest && src);while(count--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return start;
}int main()
{char arr1[20] = "abcdef";char arr2[] = "fdggdfg";char* a1 = memcpy(arr1, arr2+2, 3);printf("a1 = %s\n", a1);char* a2 = Mymemcpy(arr1, arr2+2, 3);printf("a2 = %s\n", a2);char* a3 = Mymemcpy1(arr1, arr2 + 2, 3);printf("a3 = %s\n", a3);return 0;
}

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

2.1函数原型

void *memmove( void *dest, const void *src, size_t count );

该函数是将源内存块的count个字节拷贝到目标内存块中

和memcpy不同的是,该函数可以对内存块重叠的两块空间进行拷贝,可以说:可以使用memmove来代替使用memcpy函数

2.2函数使用

2.2.1使用函数处理整形数据

//2.2.1使用函数处理整形数据
int main()
{int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[] = {6,7,8,9,10};memmove(arr1, arr2, sizeof(arr2[0])*5);return 0;
}

这时就实现拷贝啦~:
在这里插入图片描述

2.2.2使用函数处理重叠类型(源空间和目标空间重叠)

int main()
{int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1+1, arr1, sizeof(arr1[0]) * 5);return 0;
}

这时函数就完全可以实现重叠区域的拷贝了✌
在这里插入图片描述

2.3memmove函数的模拟实现

我们先对函数模拟实现的方法进行简单的分析:
‘
令一种情况,也就是src<dest时,我们就需要从后向前复制,所以该函数的模拟实现如下:

//2.3memmove函数的模拟实现
char* Mymemmove(char* dest, const char* src, size_t count)
{assert(dest && src);if (src > dest){while (count--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{while(count--){*((char*)dest + count) = *((char*)src+count);}}
}int main()
{int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };Mymemmove(arr1, arr1+1, sizeof(arr1[0]) * 5);return 0;
}

3.memset函数的使用

3.1函数原型

void *memset( void *dest, int c, size_t count );

该函数的作用是将内存块上的每个字节都设置为指定的值

函数参数:
1.dest:指向要填充的内存块的指针,表示要填充的内存块的首地址
2.c:第二个参数为int类型,它是要填充的值,虽然它为int类型,但是在使用时,会先将该值转换成char类型再填充内存
3.count:表示要填充的内存数
函数返回值:
函数返回的是目标空间的首地址

3.2函数使用注意事项

3.2.1对于整形变量的设置

//3.2.1对于整形变量的设置
int main()
{//我们假设要将arr数组中的前4个数设置成1int arr[10] = { 1,2,3,4,5,6 };memset(arr, 1, 16);return 0;
}

对于上面的代码,结果为:
在这里插入图片描述
这是因为:
对于填充的值,会先被转换成char类型,再进行填充,填充规则如下:
在这里插入图片描述

3.3函数的具体使用

使用函数完成初始化函数

//3.3.1使用函数完成初始化函数
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };memset(arr, 0, sizeof(arr));for (int i = 0; i < 10; i++)printf("%d ", arr[i]);return 0;
}

此外,函数还可以进行结构体清空等操作

4.memcmp函数的使用

4.1函数原型

int memcmp( const void *buf1, const void *buf2, size_t count );

该函数是将buf1内存块和buf2内存块进行比较,比较的方法是对应内存块逐字节比较

函数返回值:
该函数返回值和strcmp函数返回值相同:

在这里插入图片描述

4.2函数使用

注意:
函数是逐字节进行比较,当某一刻字节数不一样时,就返回对应的值

//4.2函数使用
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 1,2,3,4,6 };int ret1 = memcmp(arr1, arr2, 16);//两个数组前16个字节相同,返回0printf("ret1 = %d\n", ret1);int ret2 = memcmp(arr1, arr2, 17);//从第17个字节开始不同,而且6>5,arr2>arr1,返回一个负值printf("ret2 = %d\n", ret2);return 0;
}

在这里插入图片描述

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

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

相关文章

python探索时钟模拟之旅:从设计到实现

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、设计时钟类 三、代码实现 四、扩展功能&#xff1a;指定步数后自动停止 五…

开一个抖音小店可以经营几个类目?经营几个类目最合适?

大家好&#xff0c;我是喷火龙。 抖音小店的商品类目和商品数量是没有限制的&#xff0c;只要是在营业执照的经营范围之内的类目都能入驻抖音小店&#xff0c;但是选择的主营类目不能超过三个。 有些商家可能会想&#xff0c;自己经营多个类目&#xff0c;做多种商品种类&…

VMware安装Ubuntu系统(超详细)

一.Ubuntu官网下载镜像 Ubuntu官网&#xff1a;Enterprise Open Source and Linux | Ubuntu 二.安装Ubuntu系统 选择文件->创建虚拟机新建虚拟机&#xff08;ControlN&#xff09;&#xff0c;这里直接选择典型即可 选择稍后安装系统 选择linux Ubuntu 64位 填写虚拟机名称…

R语言入门 | 使用 dplyr 进行数据转换

3.1简介 3.1.1准备工作 3.1.2 dplyr 基础 • 按值筛选观测&#xff08; filter() &#xff09;。 • 对行进行重新排序&#xff08; arrange() &#xff09;。 • 按名称选取变量&#xff08; select() &#xff09;。 • 使用现有变量的函数创建新变量&#xff08; …

数字孪生3D智慧园区可视化能耗管控平台

智慧园区是园区与互联网的完美融合。通过整合信息技术和各类资源&#xff0c;我们实现了园区内各个服务的数字化运营&#xff0c;不仅降低了企业的运营成本&#xff0c;更提高了管理效率 智慧园区3D互动大屏系统利用web3d开发、三维可视化、模拟仿真和数字孪生技术&#xff0c;…

【算法工程师】(三年面试五年模拟版)总结

写在前面&#xff1a; WeThinkIn &#xff08;公主号&#xff09; 学习经验分享 目录 1、机器学习基础 2、深度学习基础 2.1 1*1卷积的作用 注&#xff1a;卷积核的个数对应输出的通道数&#xff08;channels&#xff09;&#xff0c;比如输入6*6*64&#xff0c;卷积核1…

香橙派Orange AI Pro 初体验

什么是香橙派 &#xff1f; 香橙派&#xff08;Orange Pi&#xff09;是深圳市迅龙软件有限公司旗下的开源产品品牌。它专注于为全球个人和企业提供高性价比的开源硬件、开源软件以及OEM/ODM服务。香橙派已经迭代了30多款产品&#xff0c;形成了涵盖开源硬件、开源软件、开源芯…

使用Jmeter进行性能测试的基本操作方法

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

如何去除input框在复制内容时自动填充的背景颜色

今天在项目开放时遇到了一个问题在输入复制内容时会有一个自带的背景颜色无法去除&#xff1b; 效果图&#xff1a; 修改的核心代码&#xff1a; /* 修改自动填充时的背景颜色 */ input:-internal-autofill-previewed, input:-internal-autofill-selected {-webkit-text-fil…

Java开发-特殊文本文件,日志技术

目录 01.特殊文件,日志技术概述 02.特殊文件:Properties属性文件 ​编辑Properties案例 特殊文件:XML文件 XML的作用和应用场景 读取XML文件中的数据 XML的生成 约束XML文件的编写[了解] 日志技术 日志技术的体系 ​编辑 ​编辑 Logback日志框架的概述 Logback快…

cocos creator做圆形进度条

效果图&#xff1a; 我们在开发过程中经常要用到圆形进度条&#xff0c;例如技能CD 原文链接 之前写了一篇cocos2dx-lua_ProgressTimer创建扇形进度条,这里简单记录下在cocosCreator中如何制作。 具体方法 cocosCreator做起来比2dx还是要简单很多&#xff0c;首先给节点添加p…

Activity详解,用最通俗的语言告诉你什么是Activity(一)

大家好&#xff0c;我是小布丁。 今天还是分享Android基础知识&#xff0c;有Android基础的朋友都知道&#xff0c;Activity作为Android四大组件之一&#xff0c;掌管可视化界面。也是大多数人刚接触Android学的第一课。下面我来带大家学习/复习这部分知识&#xff0c;请大家不…

DotNetty ByteBuffer

DotNetty是一个高性能的.NET网络通信框架&#xff0c;基于Netty&#xff0c;支持TCP、UDP、HTTP、WebSocket等协议。适用于高并发、低延迟场景&#xff0c;如实时通信、游戏服务器、IoT应用及大型分布式系统&#xff0c;通过异步I/O、零拷贝等技术提升性能&#xff0c;具备易用…

【3.vi编辑器使用(上)】

一、vi编辑器的三种模式及切换命令 1、vi是linux中最基本的编辑器。但vi编辑器在系统管理、服务器配置工作中永远都是无可替代的。 2、vi编辑器的三种模式&#xff1a;命令行模式、插入模式、底行模式。 &#xff08;1&#xff09;命令行模式&#xff1a;用户在用vi编辑文件…

智能变革:领域大模型重塑企业知识管理!

在如今知识密集型的行业领域里&#xff0c;企业员工每天都要与海量的文档和信息打交道&#xff0c;工作邮箱里充斥着无数邮件&#xff0c;办公桌上堆满了各种报告和文档&#xff0c;而每一个文件里都可能藏有关键信息。 然而&#xff0c;要从这些杂乱无章的信息海洋中找到需要…

AI生成四季变化解决方案,四季之美,一图尽揽

随着AI技术已经渗透到我们生活的方方面面&#xff0c;在这个充满变化的时代&#xff0c;美摄科技以其前沿的AI生成技术&#xff0c;为企业带来了全新的视觉体验——AI生成四季变化解决方案。这一方案不仅能够让车辆实拍的照片焕发不同季节的风采&#xff0c;更能在不改变原图构…

【Windows配置nginx开机自启】

Windows配置nginx开机自启 方式一&#xff1a;将nginx加入到windows服务中方式二&#xff1a;通过windows任务计划设定nginx开机自启 方式一&#xff1a;将nginx加入到windows服务中 下载window service wraper&#xff08;https://github.com/winsw/winsw/releases&#xff0…

C++ 进阶(3)虚函数表解析

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 请多多指教&#xff01; 目录 一、虚函数表 二、单继承&#xff08;无虚函数覆盖&#xff09; 继承关系表&#xff1a; 对于实例&#xff1a;derive d 的虚函数表&#xff1a; 对于实例&#xff1a;b…

QT系列教程(5) 模态对话框消息传递

模态对话框接受和拒绝消息 我们创建一个模态对话框&#xff0c;调用exec函数后可以根据其返回值进行不同的处理&#xff0c;exec的返回值有两种&#xff0c;Qt的官方文档记录的为 QDialog::Accepted QDialog::RejectedAccepted 表示接受消息&#xff0c; Rejected表示拒绝消息…

如何将前端项目打包并部署到不同服务器环境

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站尚硅谷的前端讲师【张天禹老师】整理的&#xff0c;用于自己复盘&#xff0c;有需要学习的可以去b站学习原版视频&…