内存函数的学习

额外知识点

第一个 

 假设c为int类型,(char)c之后,之后如果还用变量c的话,c依然为int类型。()强制转换操作符并不会永久改变原本的变量类型。

第二个

\0在打印时不会显示出来 

第三个 

 void *能接收任意类型指针,除了被const修饰的指针类型。 我们要接受被const修饰的指针,就要用const void* 去接受。 

memcpy和memmove

memcpy

其格式为

其作用是将从source往后的num个字节拷贝到destination上。(从前往后拷贝)

 memcpy相比于strcpy

strcpy只适用于字符串,并且遇到\0就自动结束拷贝

memcpy 对于任何数据类型都能拷贝,所以用void*接收,并且遇到\0不会结束,它只在拷贝完num的字节后结束。

 如果destination和source中有重叠的内存,那么就不能用memcpy,否则会发生错误。这时候我们要用到memmove。

有人在vs2022用memcpy对有重叠内存的参数进行拷贝,但是正常结果,这并不代表memcpy本身有能对重叠内存的参数进行拷贝的功能,而是vs2022使memcpy能实现该功能,在其他编译器就不一定了。

所以如果发生这种情况,我们就用memmove,不能用memcpy,即使它在编译器的帮助下也能实现。

 

 memcpy的模拟实现

void * memcpy ( void * dst, const void * src, size_t count)
{void * ret = dst;assert(dst);assert(src);/** copy from lower addresses to higher addresses*/while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}return(ret);
}

在这我们还知道,对dst 强制类型转换为char*后,并没改变dst的本质void*类型,其本质依然为void*类型,之后如果要用还是要强制转换才能用。

 memmove

其格式和memcpy一模一样 

其实可以理解memmove为高配的memcpy,当其不重叠时,可以实现,当其重叠时依然可以实现。 而memcpy只能实现不重叠的,重叠的不能实现。 更加高级。 

 

当重叠时,如果依旧拷贝,并且结果依然为正确,那就必须遵循:

当source在dest左边时,向左复制(从后往前复制)。如果source在dest右边,向右移动(从前往后复制)。

所以模拟memmove的代码为

void * memmove ( void * dst, const void * src, size_t count)
{void * ret = dst;if (dst <= src || (char *)dst >= ((char *)src + count)) {/** Non-Overlapping Buffers* copy from lower addresses to higher addresses*/while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}}else {/** Overlapping Buffers* copy from higher addresses to lower addresses*/dst = (char *)dst + count - 1;src = (char *)src + count - 1;while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst - 1;src = (char *)src - 1;}}return(ret);
}

 memset 

 memset是从ptr地址开始,将每个字节的值变为value值,改变num个字节。

在使用时,由于其改变是改变一个字节,如果在对整形做改变,因为整形为四个字节,所以起不到很好的效果,一般我们都是对字符数组做改变。 (常量字符串不可修改,所以不能当作参数被修改,类型带const,不能被void*接收)

因为是改变一个字节,且一般对字符数组做改变。所以value使用时一般为字符 。

下图是使用时的一个经典例子,一般使用memset都是对字符数组进行改变,使其等于的值一般都为字符。 

#include <stdio.h>
#include <string.h>
int main ()
{char str[] = "hello world";memset (str,'x',6);printf(str);return 0;
}

memcmp

 

 

跟strncmp有点像,只不过一个比字符(只能作用于字符串),一个比字节(任意数据都可以)。 其作用原理本质几乎差不多,就从第一个字节大小比较,如果相等比较下一个字节大小。第一个大于第二个返回大于0的整数,相反则返回小于0,相等则返回0.

下面举个例子 

#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);elseprintf("'%s' is the same as '%s'.\n", buffer1, buffer2);return 0;
}

 

 总结

这就是我们的内存函数 ,其头文件都为#include<string.h>.到这里,我们就讲了四个内存函数,都是以字节为单位去作用。

之后我们将给大家介绍数据在内存中的存储,谢谢大家!

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

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

相关文章

浏览器原理篇—渲染阻塞

渲染阻塞 1.DOM 的解析 html 文档 边加载边解析 的&#xff1b;网络进程和渲染进程之间会建立一个共享数据的管道&#xff0c;网络进程接收到数据实时传递给渲染进程&#xff0c;渲染进程的 HTML 解析器&#xff0c;它会动态接收字节流&#xff0c;并将其解析为 DOM 2.字节流…

Linux Centos-7.5_64bit 等保测评

一、新增用户 新增test用户 useradd test 设置密码 passwd 修改test的密码 passwd test 修改/etc/sudoers文件&#xff0c;找到下面一行&#xff0c; /etc/sudoers test ALL(ALL) ALL 保存是出现 E45: readonly option is set (add ! to override) 解决办法&#xff…

Unity协程的定义、使用及原理,与线程的区别、缺点全方面解析

目录 协程的定义及简介 协程的用途 定时器 将复杂程序分帧执行 等待某些条件完成后执行后续 异步加载资源 协程的原理 MonoBehaviour中每一帧的游戏循环 迭代器 IEnumerator 接口 具体执行过程 协程和线程的区别 协程的缺点 无法返回值 依赖于MonoBehaviour 维护…

Uniapp + Vue3 + Pinia + Vant3 框架搭建

现在越来越多项目都偏向于Vue3开发&#xff0c;想着uniapp搭配Vue3试试效果怎么样&#xff0c;接下来就是详细操作步骤。 初始化Uniapp Vue3项目 App.vue setup语法 <script setup>import {onLaunch,onShow,onHide} from dcloudio/uni-apponLaunch(() > {console.l…

在k8s中使用Helm安装harbor并将Chart推送到私有仓库harbor

使用Helm安装harbor并将Chart推送到私有仓库harbor 注意&#xff1a;如果你的harbor是之前docker-compose安装的&#xff0c;还需要额外做一个动作&#xff0c;让它支持chart docker-compose stop ./install.sh --with-chartmuseum1&#xff09;下载harbor的chart包 Harbor的…

攻防世界——Hello, CTF

运行可以发现这是输入型的flag &#xff08;re题目分为两类&#xff0c;一种你直接输入flag&#xff0c;还有一种就是你完成某个操作后&#xff0c;给你flag&#xff09; 可以发现关键字符串就是wrong 和 input 32位 IDA打开 进入直接进入字符串界面&#xff0c;发现关键字符…

CSS:浮动

CSS&#xff1a;浮动 浮动效果浮动方式 float浮动特性标准流脱标脱标的影响脱标的影响范围 清除浮动清除浮动原理 clear基于clear的清除浮动方式额外标签法:afert伪元素法双伪元素法 清除浮动原理 BFCBFC定义BFC布局规则创建一个BFC基于BFC的清除浮动方式父级添加overflow法 浮…

UEC++ 捡电池初级案例 day16

捡电池案例 创建第三人称模版 创建Actor基类 创建一个Actor类用来作为可拾取物品基类需求&#xff1a;我们让这个基类有静态网格可识别&#xff0c;然后得有一个状态就是是否被拾取的状态&#xff0c;那就得拥有改变状态的函数与返回状态的函数&#xff0c;然后和返回这个实…

Yestar成都艺星舒适热玛吉星品沙龙会在蓉成功发布

12月21日&#xff0c;由Yestar成都艺星联合索塔医疗联合举办的“舒适无痛热玛吉星品沙龙会”在院内圆满举行&#xff0c;索塔医疗西区大客户经理肖峰、中国临床事业部刘颖&#xff0c;成都艺星运营部长程燕佳&#xff0c;皮肤科院长朱紫婷、技术院长杨海皎、主任王小琴&#xf…

年末汇总⭐️ 我是如何从学生切换到职场人身份的

目录 2023.12.23 天气阴 温度较低 一、Learning 二、Working 三、Living 章末 2023.12.23 天气阴 温度较低 小伙伴们大家好&#xff0c;冬已至 年将末 身为逮虾户的我看到大家的年末总结心中也不由得涌起一股创作热情&#xff0c;奈何没文化&#x…

MySQL——复合查询

目录 一.基本查询回顾 二. 多表查询 三.自连接 四.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 一.基本查询回顾 准备数据库&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…

【小沐学写作】Docsify制作在线电子书、技术文档(Docsify + Markdown + node)

文章目录 1、简介2、安装2.1 node2.2 docsify-cli 3、配置3.1 初始化3.2 预览效果3.3 加载对话框3.4 更多页面3.5 侧 栏3.6 自定义导航栏 结语 1、简介 https://docsify.js.org/#/?iddocsify 一个神奇的文档网站生成器。 简单轻巧没有静态构建的 html 文件多个主题 Docsify…