首页 > 系统相关 >让头发掉光成为最强程序员之内存函数(memcpy、memmove)

让头发掉光成为最强程序员之内存函数(memcpy、memmove)

时间:2024-12-04 23:33:04浏览次数:13  
标签:sore dest void memmove char 程序员 int memcpy

今日思想:懂事的人连崩溃都会选好时间!

一、memcpy使用和模拟实现

1、memcpy使用

void* memcpy(void*dset,const void* sore,size_t num)

上述函数的使用方法和解释:

①这个函数会把sore数组的前num个字节复制到dest数组的前num个字节上。

②memcpy函数在遇到'\0'之前不会停下来。

③如果dest和sore指向同一个数组,复制的结果未知(建议使用memmove函数)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{

	int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[30] = { 0 };
	memcpy(arr2,arr1,5*sizeof(int));
	//printf("%s\n", arr2);
	for (int i = 0; i < 30;i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

2、模拟实现

分析:根据memcpy函数的定义可知

void* memcpy(void*dset,const void* sore,size_t num)

        因为sore和dest是void*类型,我们可以传任意类型的数据,但是我们不能解引用,使用我们要强制类型转换成char*,为什么强制转换成char*因为我们不论传什么类型的数据都可以通过char*来一个个访问;例如传的是int*的类型,如果访问的话在x64位就是8个字节在x32位就是4个字节来访问。

所以代码实现:

*(char*)dest = *(char*)sore;
dest = (char*)dest + 1;
sore = (char*)sore + 1;

 

最终代码: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

void* my_memcpy(void* dest, const void* sore, size_t num)

{

	void* set = dest;

	for (int i = 0; i < num; i++)

	{

		*(char*)dest =*(char*)sore;

		dest = (char*)dest + 1;

		sore = (char*)sore + 1;

	}

	return set;

}

int main()

{



	int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };

	int arr2[30] = { 0 };

	my_memcpy(arr2,arr1,5*sizeof(int));

	//printf("%s\n", arr2);

	for (int i = 0; i < 30;i++)

	{

		printf("%d ", arr2[i]);

	}

	return 0;
}

二、memmove使用和模拟实现

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

1、memmove的使用介绍

①dest和sore可以指向同一个数组。

②这个函数会把sore数组的前num个字节复制到dest数组的前num个字节上。

③memcpy函数在遇到'\0'之前不会停下来。

2、使用效果和memcpy函数一样。

3、模拟实现

        分析跟memcpy函数一样,不过有一点不同:

        当dest和sore指向同一个数组时:

        分析如下:

        ①当dest>=sore    从前往后复制,如果从后往前复制的话会有部分内容被覆盖得不到想要的值

        图解:

        代码实现 :

if (sore <= dest)
{
	dest = (char*)dest + num-1;
	sore = (char*)sore + num-1;
	while (num--)
	{
		*(char*)dest = *(char*)sore;
		dest = (char*)dest - 1;
		sore = (char*)sore - 1;
	}
}

        ②当dest<sore        从后往前复制。

        图解:

        

        代码实现:

else
{
	for (int i = 0; i < num; i++)
	{
		*(char*)dest = *(char*)sore;
		dest = (char*)dest + 1;
		sore = (char*)sore + 1;
	}
}

        完整的代码实现: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void* my_memcpy(void* dest, const void* sore, size_t num)
{
	void* set = dest;
	if (sore <= dest)
	{
		dest = (char*)dest + num-1;
		sore = (char*)sore + num-1;
		while (num--)
		{
			*(char*)dest = *(char*)sore;
			dest = (char*)dest - 1;
			sore = (char*)sore - 1;
		}
	}
	else
	{
		for (int i = 0; i < num; i++)
		{
			*(char*)dest = *(char*)sore;
			dest = (char*)dest + 1;
			sore = (char*)sore + 1;
		}
	}
	return set;
}
int main()
{

	int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[30] = { 0 };
	my_memcpy(arr2,arr1,5*sizeof(int));
	//printf("%s\n", arr2);
	for (int i = 0; i < 30;i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

标签:sore,dest,void,memmove,char,程序员,int,memcpy
From: https://blog.csdn.net/2403_84958571/article/details/144013346

相关文章

  • 一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?
    前两天在某乎上看到一个问答,说的是:一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?这个问题也引发了我的一些思考,可能很多人会说,“作为高级工程师,基础得过硬、得熟练掌握一门编程语言、至少看过一个优秀开源项目的源代码、有过高并发/性能优化的工作经验、沟通......
  • HTML5期末考核大作业,个人网站—— 程序员个人简历模板下载HTML+CSS+JavaScript (2)
    ......
  • 那些40岁的程序员都去哪了?
    前言最近和不少30多岁的程序员朋友们聊天,发现大家普遍非常焦虑。原因主要有几点,一是担心未来能不能继续保持现有收入,害怕40岁之后薪资会不会下降,甚至失业。二是大家普遍有房贷或者车贷,这本身也是一种精神压力。三是身边的某某所在的公司要上市了,某某在大厂又升职了,对比产......
  • 程序员被裁员后找不到工作,该怎么办?
    前言前段时间上映了一部电影《逆行人生》引发了不少讨论,尽管上映前舆论略显两极化,但是该电影还挺写实的。该电影讲述了一位45岁的程序员小组长突然被裁员,坠入底层后如何逐步克服物理和心理上的困难,最终选择成为外卖骑手继续前行的故事。这个故事在某种程度上反映了当前许......
  • 程序员的金三银四求职宝典
    程序员的金三银四求职宝典引言每年的春天,程序员们的奋斗热情仿佛重新被点燃,这正是金三银四求职季。在这个周期,不同的机会和挑战交织着,你准备好迎接挑战了吗?如果你正在考虑跳槽,有必要让自己跟上这个行业的步伐,以确保在竞争激烈的求职市场中脱颖而出。本文旨在为你提供一个......
  • 程序员在LabVIEW编程时要注意哪些法律问题
    在使用LabVIEW进行编程时,程序员需要注意一些法律问题,尤其是在知识产权、许可协议、数据保护等方面。以下是程序员在LabVIEW编程过程中可能遇到的主要法律问题和应注意的事项:​1. 软件许可与版权问题LabVIEW作为商业软件,其使用受限于NI(National Instruments)所制定的许可......
  • 《程序员修炼之道》第六章读后感
    在《程序员修炼之道》第六章中,作者深入探讨了如何通过持续学习和自我修炼来保持职业的长青。这一章的核心思想,便是“程序员的成长不仅仅依赖于技术的积累,更依赖于心态的调整和方法的应用。作者指出,技术的飞速发展要求程序员具备终身学习的心态。第六章强调了在软件开发领......
  • 程序员修炼之道——从小工到专家读书笔记7
    第七章:软件工艺——追求卓越这一章深入探讨了软件工艺的核心价值,强调程序员应当追求卓越,将编程工作上升至艺术的高度。软件工艺不仅仅是一种技术层面的追求,更是一种态度上的体现。作为专业的程序员,应当以工匠的精神对待每一行代码,致力于编写高质量、易于维护的程序。在精益求精......
  • 《程序员修炼之道——从小工到专家》笔记5
    《程序员修炼之道》不仅是一本关于个人技能提升的书,它还深刻探讨了团队协作的重要性及有效方法。1.在团队中,良好的沟通是项目成功的关键。书中提倡开放、诚实的沟通环境,鼓励团队成员之间及时分享想法、问题和进展。有效的沟通能够减少误解,增强团队凝聚力,确保项目顺利进行。2.协......
  • 《程序员修炼之道——从小工到专家》笔记4
    在阅读《程序员修炼之道》这本书的过程中,我深刻体会到了作为一名程序员,不仅要有扎实的技术基础,更要有对代码的热爱与敬畏之心。书中通过一系列实用的原则和实践,引导我们如何在编程的世界里不断精进,实现个人与技术的共同成长。1.书中强调,编写清晰、易读的代码比追求炫技更为重要。......