C语言内存函数讲解

目录

文章目录

内存函数针对的数据类型不确定可能是整型数据,字符数据,结构体数据......

memcpy的使用和模拟实现

 memcpy的使用

memcpy打印字符数据

 memcpy打印整型数据

 memcpy的模拟实现

 模拟实现的memcpy打印重叠情境

 memmove的使用和模拟实现

 memmove的使用

 memove的模拟实现

 memset函数的使用和模拟实现

 memset的使用

 memset的模拟实现

 memcmp的使用和模拟实现

memcmp的使用

 memcmp的模拟实现



内存函数针对的数据类型不确定可能是整型数据,字符数据,结构体数据......

memcpy的使用和模拟实现

我们先看一下菜鸟教程中对memcpy的解释

 

 void *memcpy(void *str1, const void *str2, size_t n)

 memcpy的使用

memcpy打印字符数据

#include <stdio.h>
#include <string.h>
int main()
{char arr[100] = { 0 };char arr2[50] = "woshi shuaige";memcpy(arr, arr2, 7);int i = 0;for (i = 0; i < 7; i++){printf("%c", arr[i]);}return 0;
}

 

 memcpy打印整型数据

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

 memcpy最好不要处理重叠的内存,对于重叠的内存,我们交给memmove来处理

 memcpy的模拟实现

#include <stdio.h>
#include <assert.h>
void* mymemcpy(void* str1, const void* str2, size_t n)
{void* ret = str1;assert(str1, str2);while (n--){*(char*)str1 = *(char*)str2;str1 = (char*)str1 + 1;str2 = (char*)str2 + 1;}return ret;
}
int main()
{char arr[100] = { 0 };char arr2[50] = "woshi shuaige";mymemcpy(arr, arr2, 7);int i = 0;for (i = 0; i < 7; i++){printf("%c", arr[i]);}return 0;
}

 模拟实现的memcpy打印重叠情境

void* mymemcpy(void* str1, const void* str2, size_t n)
{void* ret = str1;assert(str1, str2);while (n--){*(char*)str1 = *(char*)str2;str1 = (char*)str1 + 1;str2 = (char*)str2 + 1;}return ret;
}
int main()
{int arr[50] = {1,2,3,4,5,6,7,8,9,10};mymemcpy(arr+2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

 

 memmove的使用和模拟实现

 

 void * memmove ( void * destination, const void * source, size_t num );

 memmove的使用

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

 

 memove的模拟实现

 


#include <stdio.h>
#include <assert.h>
void* mymemmove(void* destination, const void* source, size_t num)
{void* ret = destination;assert(destination && source);if (destination < source){while (num--){*(char*)destination = *(char*)source;destination = (char*)destination + 1;source = (char*)source + 1;}}else{while (num--){*((char*)destination + num) = *((char*)source + num);}}return ret;
}
int main()
{int arr[50] = { 1,2,3,4,5,6,7,8,9,10 };mymemmove(arr+2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

 memset函数的使用和模拟实现

 

 

 void * memset ( void * ptr, int value, size_t num );

 memset的使用

#include <stdio.h>
#include <string.h>
int main()
{char arr[50] = "woshi shuaige";memset(arr, 'x', 6);printf("%s", arr);return 0;
}

 

 注意memset在设置的时候,是以字节为单位来设置的。

 memset的模拟实现

#include <stdio.h>
void* mymemset(void* ptr, int value, size_t num)
{void* ret = ptr;int i = 0;for (i = 0; i < num; i++){*((char*)ptr + i) = 'x';}return ret;
}
int main()
{char arr[50] = "woshi shuaige";mymemset(arr, 'x', 5);printf("%s", arr);return 0;
}

 

 memcmp的使用和模拟实现

 

 

 

 int memcmp ( const void * ptr1, const void * ptr2, size_t num );

memcmp的使用

#include <stdio.h>
#include <string.h>
int main()
{char arr[100] = "woshi shuaige";char arr1[50] = "woshi shuaibi";int ret=memcmp(arr, arr1, 12);printf("%d\n", ret);return 0;
}

 memcmp的模拟实现

#include <stdio.h>
int mymemcmp(const void* ptr1, const void* ptr2, size_t num)
{while (num--){if (*(char*)ptr1 > *(char*)ptr2){return 1;}else if (*(char*)ptr1 < *(char*)ptr2){return -1;}else{ptr1 = (char*)ptr1 + 1;ptr2 = (char*)ptr2 + 1;}}return 0;
}
int main()
{char arr[100] = "woshi shuaige";char arr1[50] = "woshi shuaibi";int ret = mymemcmp(arr, arr1, 12);printf("%d\n", ret);return 0;
}

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

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

相关文章

为什么出海企业需要呼叫中心?

随着现代商业世界的发展&#xff0c;企业面临着越来越多的挑战和机遇。为了提高客户服务水平、客户满意度、企业形象和销售业绩&#xff0c;呼叫中心已成为越来越多企业的首选。那么&#xff0c;为什么出海企业需要呼叫中心呢&#xff1f; 1. 提高客户服务质量 首先&#xff…

el-table进行列的拖拽

1、使用Sortable插件 下载&#xff1a; npm install sortablejs --save 引入到当前使用的页面 import Sortable from sortablejs 代码重点&#xff1a;可以参考以下代码&#xff08;不是拿来就可以用的,需要摘取重要代码的内容&#xff09; row-key"id" 必须添加且唯…

Linux | tar,bc,uname指令

Linux | tar&#xff0c;bc&#xff0c; 文章目录 Linux | tar&#xff0c;bc&#xff0c;tar指令【重要】bc指令uname –r指令 tar指令【重要】 tar [-cxtzjvf] 文件与目录 … 参数&#xff1a; -c &#xff1a;建立一个压缩文件的参数指令(create 的意思)&#xff1b;-x &am…

为什么对中小企业来说,数字化转型很难?

引言 数字化转型对中小企业至关重要&#xff0c;然而&#xff0c;实施这一转型却充满挑战。中小企业面临着资源、技术、文化和安全方面的种种难题&#xff0c;这些困难限制了它们在数字化领域的发展和竞争力。这种挑战不仅影响企业内部运营&#xff0c;还直接影响其与客户和市…

中国的下一个风口:数字化!

——“中国的下一个风口是什么&#xff1f;数字化&#xff1f;你赞同吗&#xff1f;” ——“中国的下一个风口是不是‘数字化’&#xff0c;不敢妄下定论。” 但可以肯定的是&#xff0c;企业想站上未来产业的风口&#xff0c;“数字化”是必经之路。也就是说&#xff0c;数…

HarmonyOS 开发 Java 与 ArkTS 如何抉择?

本文详细分析 Java 与 ArkTS 在 HarmonyOS 开发过程的区别&#xff0c;力求解答学员的一些困惑。 何为 HarmonyOS&#xff1f; 在讨论语言的差异时&#xff0c;我们先了解下什么是 HarmonyOS。华为官方是这么解释 HarmonyOS 的&#xff1a; “鸿蒙操作系统”特指华为智能终端…

Java Scheduled定时任务(二)——开启多线程定时任务

我们在Java Scheduled定时任务中已经学到了如何开启定时任务&#xff0c;但却在同时开启多个定时任务的时候&#xff0c;遇到了新的问题&#xff0c;Scheduled定时任务是单线程的&#xff0c;无法满足同一个时间开启多个定时任务&#xff0c;因此&#xff0c;我们进行了如下调整…

视频集中存储/智能分析融合云平台EasyCVR平台接入rtsp,突然断流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Halcon 机械视觉 使用仿射变换 机械手实现孔位定位

要推算机械手平面坐标系A与相机平面坐标系B的关系&#xff0c;我们可以首先找到两个平面坐标系之间的平移量和旋转量。 平移量&#xff1a;选择一个公共的参考点&#xff0c;比如某个标志物&#xff0c;假设在坐标系A中的坐标为(Ax, Ay)&#xff0c;在坐标系B中的坐标为(Bx, B…

GD32F303移植RT-Thread

我的平台&#xff1a; 芯片&#xff1a;GD32F303CCT6 编译器&#xff1a;KEIL5 一、下载keil专用 RT-Thread 安装包 https://www.keil.arm.com/packs/ 。。。。 。。。。 二、准备一个干净的GD32F303裸机工程&#xff0c;我就增加了串口功能 三、开始移植 1.rt-thread系统…

微信管理神器,一起看看能解决哪些问题?

对于很多公司的销售来说&#xff0c;最大的一个特点就是需要进行外出拜访客户&#xff0c;很多的时候&#xff0c;尤其是在出差或者是外出的时候&#xff0c;我们不能及时的回复客户消息&#xff0c;导致客户流失。 所以我们需要在手机上随时能管理我们的客户&#xff0c;并且第…

Java网络编程——非阻塞通信

对于用ServerSocket以及Socket编写的服务器程序和客户程序&#xff0c;它们在运行过程中常常会阻塞。例如当一个线程执行ServerSocket的accept()方法时&#xff0c;假如没有客户连接&#xff0c;该线程就会一直等到有了客户连接才从accept()方法返回。再例如当线程执行Socket的…

【Java 基础】08 面向对象

面向对象是一种程序设计范式&#xff0c;它以对象为中心&#xff0c;将数据和操作数据的方法组织在一起。 Java 正是一门面向对象的编程语言&#xff0c;它的设计理念强调代码的重用性、可维护性和可扩展性。 本文将简要介绍Java面向对象编程的基本概念和特性。 1. 对象和类…

使用 WITH 语句和临时表

文章目录 WITH 语句和临时表员工部门案例&#xff08;单个 WITH 查询&#xff09;建表&#xff1a;写入数据&#xff1a;使用WITH查询 扩展案例&#xff1a;员工、部门、薪水和级别&#xff08;多个 WITH 查询&#xff09;建表和插入数据&#xff1a;使用多个WITH查询 结语 WIT…

python入门级简易教程

Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年创建。它是一种通用的、解释型的、高级的、动态的、面向对象的编程语言。 Python的编程哲学是简洁明了&#xff0c;强调代码的可读性和简洁性&#xff0c;使开发人员能够快速开发出正确的代码。Python被广泛用…

Chart 5 性能优化概述

文章目录 前言5.1 可移植性5.2 优化梗概5.3 OpenCL 移植的初始评估5.4 将CPU代码移植到OpenCL GPU5.5 并行化GPU和CPU工作负载5.6 瓶颈分析5.6.1 识别瓶颈5.6.2 解决瓶颈 5.7 API层面性能优化5.7.1 API函数调用的正确安排5.7.2 使用基于事件驱动的pipeline5.7.3 内核编译和构建…

2023-12-04 AIGC-Stable Diffusion和SadTalker-搭建及使用

摘要: 2023-12-04 AIGC-SadTalker-搭建及使用 代码仓库: https://github.com/Stability-AI/stablediffusion https://github.com/camenduru/stable-diffusion-webui-colab https://github.com/OpenTalker/SadTalker https://github.com/adofsauron/SadTalker-Video-Lip-Sync 文…

0基础学习云计算难吗?

很多人经常会问云计算是什么&#xff1f;云计算能干什么&#xff1f;学习云计算能做什么工作&#xff1f;其实我们有很多人并不知道云计算是什么&#xff0c;小知今天来给大家讲讲学习云计算能做什么。 中国的云计算行业目前正处于快速发展阶段&#xff0c;随着互联网和数字化…

人脸识别安卓主板_MTK方案智能闸机门禁工业安卓主板定制开发

人脸识别主板广泛应用于各个领域&#xff0c;包括人脸支付系统、人脸识别监控系统、写字楼办公楼门禁闸机、校园、地铁、住宅门禁、考勤机、智能门锁、广告机、售卖机等。 主板基于联发科MTK方案&#xff0c;并由行业PCBA和MTK的核心板组成。根据产品需求&#xff0c;可以选择…

7、类型转换构造、析构、深拷贝、类的静态成员

1、类型转换构造 |自定义转换 利用一个已定义的对象,来定义另一个不同类型的对象 实现从源类型到目标类型的隐式类型转换的目的 总结下已知构造&#xff0c;包括类型转换构造 如下&#xff0c;如果Person给Human赋值时&#xff0c;Person有私有变量&#xff0c;则需要在Pers…