C语言学习(二十九)---内存操作函数

在上一节内容中,我们学习了有关字符串操作的函数,其中分为了限制长度和不限制长度两种方式,虽然上节内容已经在很大程度上有助于程序的实现,但是其有一个致命的缺陷,聪明的你一定已经猜到了吧,对的,它只能应用于字符串,如果我想要对其他类型数据进行操作就失效了,因此有必要学习内存操作函数,好了,话不多说,开整!!!

memcpy

查看该函数的使用说明:
在这里插入图片描述
可见其传递的参数为void*,也就是空指针,没有限定指针类型,所以可以对任何类型的数据都可以进行拷贝,使用方式如下:

memcpy(目的地,源地址,多少字节)

如下所示的代码:

#include<stdio.h>
#include<string.h>
int main()
{int sou[] = {1,2,3,4,56};int des1[10]  = {0};int des2[10] = {0};strcpy(des1,sou);memcpy(des2,sou,sizeof(sou));memcpy(des3,sou,8);return 0;
}

我们F5进入调试模式,先看上节所学习的strcpy能否完成我们的要求呢:
在这里插入图片描述
可见strcpy只将1复制过来了,我们再看内存操作函数memcpy
在这里插入图片描述
可见,将源地址中的所有数据都复制过来了,下面我们查看只复制8个字节也就是两个整型des3的结果:
在这里插入图片描述
当然了,你也可以尝试其他类型的数据的拷贝操作,在此处就不一一演示了。

memmove

上述的拷贝都是从不相同源地址向目的地地址进行拷贝操作的,那么如果源地址与目的地地址所操作的变量为同一内容的情况下,使用该函数,可不可以得到不想要的效果呢,代码如下:

我们上代码进行验证,代码如下:

#include<stdio.h>
#include<string.h>
int main()
{int arr[] = {1,2,3,4,5,6};memcpy(arr+2,arr,12);return 0;
}

同样进行调试模式查看结果:
在这里插入图片描述
我去,还真可以,确实是这样,但是实际上在C语言标准中:

memcpy只需能拷贝不重叠的内存就行了
memmove用来拷贝重叠的内存

也就是memcpy太卷了不需要你做的你也给我做了,难受。。。
当然了,一个专门处理重叠内存的操作函数,名为memmove,其使用方式如下:
在这里插入图片描述
也就是:

memmove(目的地,源地址,移动多少字节的数据)

那么我们将上述代码中的memcpy函数换为memmove函数,查看结果:
在这里插入图片描述
可以看到也可以实现这个功能,用两幅图来理解这个两个函数也就是:
memcpy
在这里插入图片描述
不卷的情况下,上述的两幅图分别对应memcpymemmove两个函数。

memcmp

在前一节内容中,我们学习了字符串之间比较的函数strcmpmemcmp不仅可以比较字符串,也可以比较其他各种类型的变量,其使用方法如下

在这里插入图片描述
可见,其使用方法如下:

memcmp(目的地地址,源地址,比较多少字节)

返回值同字符串比较函数strcmp,如下所示:
在这里插入图片描述
比较方式也相同按顺序进行比较,例如以下代码:

#include<stdio.h>
#include<string.h>
int main()
{int arr1[] = {1,2,3,4,56};int arr2[] = {1,2,1,4,56};int arr3[] = {1,2,0,4,56};int res1 = memcmp(arr1,arr1+2,4);int res2 = memcmp(arr2,arr2+2,4);int res3 = memcmp(arr3,arr3+2,4);printf("%d %d %d\n",res1,res2,res3);return 0;
}

分析如下:

res1:1<3 输出小于0的数;
res2:1=3 输出等于0;
res3:1>0 输出小于0的数

编译查看结果:
在这里插入图片描述
确实和我们分析的一致。

memset

该函数是一个设置内存内容的函数,查看其使用方式:
在这里插入图片描述
也即:

memset(要设置哪的位置的地址,设置的内容,设置多少字节)

如以下代码:

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "********";memset(arr,'#',4);int i = 0;for(i=0;i<8;i++){printf("%c ",arr[i]);}return 0;
}

按照上述的理论,分析如下:
从字符数组arr的首地址开始的4个字节内容设置为#,我们编译一下,查看结果:
在这里插入图片描述
可见,确实和我们分析的一致。

上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

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

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

相关文章

一面、二面、三面有什么区别?

很多公司面试都分一面、二面、三面甚至更多&#xff0c;大家可能会好奇&#xff0c;为什么要面这么多面&#xff0c;每一面又有啥区别呢&#xff1f; 首先我来回答下为什么要这么多面&#xff0c;最核心的是最后3点&#xff1a; 如果光是一个人面&#xff0c;担心会看走眼&…

Python强类型编程

Python是一门强类型的动态类型语言&#xff0c;具体如下特性&#xff1a; 可以动态构造脚本执行、修改函数、对象类型结构、变量类型但不允许类型不匹配的操作 第一个例子体现动态性&#xff1a;用字符串直接执行代码&#xff0c;动态构建了一个函数并执行&#xff0c;甚至给…

IDEA创建一个Servlet项目(tomcat10)

一、创建maven项目 org.apache.maven.archetypes:maven-archetype-webapp 二、增加Servlet依赖 tomcat9及以前依赖 <!--加入servlet依赖&#xff08;servlet的jar&#xff09;--><dependency><groupId>javax.servlet</groupId><artifactId>ja…

设计模式-抽象工厂模式

抽象工厂模式 1、抽象工厂模式简介2、具体实现 1、抽象工厂模式简介 抽象工厂模式(Abstract Factory Pattern)在工厂模式尚添加了一个创建不同工厂的抽象接口(抽象类或接口实现)&#xff0c;该接口可叫做超级工厂。在使用过程中&#xff0c;我们首先通过抽象接口创建不同的工厂…

NoSQL之 Redis配置与优化

文章目录 一、关系数据库与非关系型数据库关系型数据库&#xff1a;非关系型数据库关系型数据库和非关系型数据库区别&#xff1a;非关系型数据库产生背景 二、Redis简介Redis 具有以下几个优点&#xff1a;使用场景&#xff1a;哪些数据适合放入缓存中Redis为什么这么快 三、R…

4、数据库操作语句:聚合函数

目录 1、定义 2、常用的聚合函数 1&#xff09;Avg/sum&#xff1a;只适用于数值类型的字段&#xff08;或变量&#xff09;。 2&#xff09;Max/min:适用于数值类型、字符串类型、日期时间类型的字段&#xff08;或变量&#xff09; 3&#xff09;Count&#xff1a; ①作…

SpringBoot自定义starter之接口日志输出

文章目录 前言文章主体1 项目全部源码2 项目结构介绍3 starter 的使用3.1 配置文件 application,yml的内容3.2 启动类3.3 控制器类 4 测试结果 结语 前言 本文灵感来源是一道面试题。 要求做一个可以复用的接口日志输出工具&#xff0c;在使用时引入依赖&#xff0c;即可使用。…

OpenCV学习笔记 | ROI区域选择提取 | Python

摘要 ROI区域是指图像中我们感兴趣的特定区域&#xff0c;OpenCV提供了一些函数来选择和提取ROI区域&#xff0c;我们可以使用OpenCV的鼠标事件绑定函数&#xff0c;然后通过鼠标操作在图像上绘制一个矩形框&#xff0c;该矩形框即为ROI区域。本文将介绍代码的实现以及四个主要…

Vue中如何进行游戏开发与游戏引擎集成?

Vue中如何进行游戏开发与游戏引擎集成&#xff1f; Vue.js是一款流行的JavaScript框架&#xff0c;它的MVVM模式和组件化开发思想非常适合构建Web应用程序。但是&#xff0c;如果我们想要开发Web游戏&#xff0c;Vue.js并不是最合适的选择。在本文中&#xff0c;我们将介绍如何…

edge自带断网游戏

在没有网络时你会不会很无聊&#xff1f;博主告诉你一个edge浏览器自带的断网小游戏&#xff0c;让你在断网时也能玩游戏&#xff01; 网址&#xff1a; 打开edge://surf这个断网游戏网站即可游玩&#xff1a; 作弊码既隐藏模式&#xff1a; 输入microsoft&#xff08;意思就…

Axure教程——图片轮播(纵向滚动)

本文介绍的时用Axure中的动态面板制作图片轮播之纵向滚动 一、预览效果 预览地址&#xff1a;https://c1s4i1.axshare.com 二、功能描述 图片纵向自动滚动播放 三、元件制作 拖入一个动态面板&#xff0c;命名为1&#xff0c;设置大小为375*155&#xff0c;并设置四个状态&…

Python对csv文件一键多值保存为json本地文件再读取加速效率(3)

最近发现做办公自动化表格匹配的时候还是csv格式的文件最快、效率是最高的 今天接到一个需求就是大致内容之这样的 1、给我一张表格直邮一列A列&#xff0c;内容是运单号 2、需要用相同的单号去另外一张表格匹配数据 3、其实就是Excel中的常见的vlookup 但是想要匹配的表格有几…