内存函数(C语言进阶)

目录

前言

1、memcpy

2、memmove

3、memcmp

4、memset      

结语


前言

        本篇介绍了C语言中的内存函数,内存函数,顾名思义就是处理内存的函数。

1、memcpy

        memcpy:内存拷贝函数。

        相对于strcpy只能拷贝字符串来讲,memcpy能拷贝其他类型的数据。

        举例子:

#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7 };int arr2[20] = { 0 };memcpy(arr2, arr1, 28);int i = 0;for (i = 0;i < 20;i++){printf("%d\n", arr2[i]);}return 0;
}

效果:

        memcpy用法讲解:

        它包括三个参数,第一个参数为要拷贝到的目标地址,第二个参数为被拷贝的内容地址,第三个为拷贝的字节大小。如上面这个例子,我们要将arr1拷贝到arr2中,前两个参数就是他们的首地址,第三个参数是根据整型数据一个大小为4,arr1中有7个整型,所以计算得拷贝得数据大小为28。这样就可以达到我们想要的效果。

        注意一个特殊情况,memcpy不用于处理重叠的内存之间的数据拷贝,如:将一个数组arr[]={1,2,3,4,5,6,7,8}; 它的前4个元素拷贝到它的第3到7个元素的位置,这时就会出错,因为当我要将第3个数拷贝到第6个位置是,其实第三个数在前面已经被第一个数覆盖了。但是在vs编译器中memcpy是可以实现重复内存操作的,实际上memcpy是没有这样的功能要求的,是vs自己改进了。

        如果需要在重叠内存间进行数据拷贝,实际要用到函数:memmove

2、memmove

        memmove函数从参数上和功能上都和memcpy是一样的,但是它可以对有重叠内存的数据之间进行拷贝。

#include <stdio.h>
#include <string.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8 };memmove(arr + 2, arr, 16);int i = 0;for (i = 0;i < 8;i++){printf("%d", arr[i]);}return 0;
}

        实现了这样一个内存重叠的操作。

3、memcmp

        我们可以参照函数strcmp,memcmp函数就是在strcmp的基础上,扩大了它所作用的数据类型,它可以对内存中任意的两个数据进行比较。那它是怎么用的呢,我们来看一个例子:

#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 1,3,2 };int ret = memcmp(arr1, arr2, 12);printf("%d\n", ret);return 0;
}

看看输出:

        先来讲讲memcmp的三个参数,它的前两个参数放的是需要比较的两组数据的其实地址,第三个参数放的是比较数据的大小(字节)。上面这个例子,我们将两个数组的名字(首地址)作为前两个参数(比较对象),最后输入了一个12,代表我们要比较12个字节的数据,也就是3个整型的数据,输出结果来看,它输出了-1,意思是arr1没有arr2大。这是因为我们只限制了比较前三个整型数据,因此arr2和arr1第一个元素相同,第二个元素arr2大于arr1,尽管后面arr1第三个数据大于arr2,但是这个函数是从前往后比的,所以只看第一个出现不同的位置之间的数据大小,后面就不管了,所以整体arr2大于arr1,所以输出-1。

        对于memcpy的输出,如果被比较的两个数据前者大于后者,返回1;前者等于后者,返回0;前者小于后者,返回-1。

4、memset      


         memset:内存设置函数,用于设置内存。

        先看一个例子:

#include<stdio.h>
int main()
{char arr[] = "hello world";memset(arr, 'x', 5);printf("%s\n", arr);return 0;
}

效果:

        先看memset的三个参数,第一个参数是被设置的内存地址,第二个参数是要设置的内容,第三个参数是需要设置的大小。

        例如上面这个例子,我们想要将arr这个字符串的前五个字符设置成x,我们就可以如上这样子使用,最后达成我们预期的效果。

        memset函数常用来初始化。注意,对于整型数据来讲,如果用memset来初始话,就只能用来初始化0,不能初始化1,因为memset是以一个字节为单位进行初始化的,如果初始化1,则对于整型数据来说,初始化的其实是01 01 01 01。

结语

        对于内存函数,就讲到这了,如果对你有所帮助,我会很开心。

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

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

相关文章

printf输出彩色log

在软件开发过程中&#xff0c;log调试是一个非常重要的排查问题的手段&#xff0c;log的输出结果可以帮助工程师验证其软件逻辑与执行结果是否一致。所以一个有彩色效果的log输出&#xff0c;可以帮到工程师更好的定位问题所在&#xff0c;并且利用特定的宏定义可以定位到问题出…

C#使用QQ邮箱发送邮件

简介 在c#中发送邮箱我们只需要引入官方提供的命名空间 System.Net.Mail &#xff0c;这个命名空间包含了一系列类&#xff0c;用于创建、配置和发送电子邮件消息。 这个命名空间中的一些主要类包括&#xff1a; MailMessage&#xff1a;表示一个电子邮件消息&#xff0c;包…

猫头虎分享已解决Bug || AttributeError: ‘Sequential‘ object has no attribute ‘session‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Vue 项目脚手架结构介绍

昨天&#xff0c;撰写了一篇文章&#xff0c;介绍如何 0 基础入门 Vue&#xff0c;算是讲清楚了学习 Vue 的路线图&#xff0c;今天&#xff0c;继续来介绍一些具体的东西。 一、开发工具 开发 Vue 的项目&#xff0c;我推荐使用 VS Code&#xff0c;有非常多的插件支持基于 …

【前端素材】推荐优质后台管理系统Uena平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

从零开始手写mmo游戏从框架到爆炸(二十三)— 装备系统一

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 目录 装备模板 装备模型 装备模板配置 加载装备模板 下一步&#xff0c;就是要考虑经验、金币、和装备掉落的问题。经验金币都好说&#xff0c;装备系统是目前需要考虑的问…

LeetCode_Java_动态规划系列(1)(题目+思路+代码)

目录 斐波那契类型 746.使用最小花费爬楼梯 矩阵 120. 三角形最小路径和 斐波那契类型 746.使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。…

Pyglet控件的批处理参数batch和分组参数group简析

先来复习一下之前写的两个例程&#xff1a; 1. 绘制网格线 import pygletwindow pyglet.window.Window(800, 600) color (255, 255, 255, 255) # 白色 lines []for y in range(0, window.height, 40):lines.append(pyglet.shapes.Line(0, y, window.width, y, colorcolo…

【AIGC大模型】跑通wonder3D (windows)

这两天看了AI大神李某舟被封杀&#xff0c;课程被下架的新闻&#xff0c;TU商 认为&#xff1a;现在这种玩概念、徒具高大上外表却无实质内容的东西太多了&#xff0c;已经形成一种趋势和风潮&#xff0c;各行各业各圈层都在做大做强这种势&#xff0c;对了&#xff0c;这种行为…

C++ 之LeetCode刷题记录(三十四)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 12. 整数转罗马数字 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xf…

力扣382.链表随机节点

Problem: 382. 链表随机节点 文章目录 题目描述思路复杂度Code 题目描述 思路 由水塘抽样易得&#xff0c;当遇到i个元素&#xff0c;有 1 / i 1/i 1/i的概率选择该元素&#xff1b;则在实际操作中我们定义一个下标i从1开始遍历每次判断rand() % i 0&#xff08;该操作就是判断…

空指针和Void指针的基本概念和用法

前言&#xff1a;本文只是限于说明空指针与void指针的基本性质和用法&#xff0c;关于更深层次的用法&#xff0c;则不介绍&#xff0c;因为本人自己还没有搞懂&#xff01;&#xff01;&#xff01; 1&#xff1a;空指针 1.1空指针的基本定义 定义:在C语言中&#xff0c;如…