memcpy与memmove函数讲解与自行实现

文章介绍了memcpy和memmove这两个内存操作函数,讲述了它们的基本功能(局部复制),以及由于编译器优化可能带来的从前向后或从后向前复制的能力。还提供了自定义的my_memcpy和my_memmove函数示例,展示了如何在不同情况下实现前后双向复制。
摘要由CSDN通过智能技术生成

memcpy和memmove两个函数都是内存操作函数

这是memcpy函数的介绍

用库函数实现数组(或者字符串也一样)局部复制,最后一个参数    为第二个地址参数     要跳跃多少个字节的字节数。       然后将第二个参数的数组所跳跃的      每一个   字节的数据都       复制到第一个数组里。

         其实按理来说memcpy其实是从前向后复制的,但是编译器对于memcpy的优化让memcpy也有从后向前复制功能,具有能判断什么时候   从前向后复制       或者        从后向前复制(memmove这个函数也是一样      原本是从后向前复制的功能    vs编译器优化使得它也一样)

                                                                                                                                                                                 接下来自行实现

#include<stdio.h>
#include<string.h>
void my_memcpy(void* arr1, const void* arr2,int n)
{
	void* arr0 = arr1;
	while (n--)
	{
		
		*(char*)arr0 = *(char*)arr2;
		arr0 = (char*)arr0 + 1;
		arr2 = (char*)arr2 + 1;
	}

	
}

int main()
{
	//从前往后拷贝

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

	return 0;
}

                                                                                                                                                                                        

#include<stdio.h>
#include<string.h>
void my_memmove(void* arr1,const void* arr2, int n)
{
	//从后向前拷贝
	while (n--)
	{
		
		*((char*)arr1 + n) = *((char*)arr2+n);
	}
}
int main()
{
	char arr[] = "123456789";
	//memmove(arr, arr + 2,3);
	my_memmove(arr , arr+2, 3);
	printf("%s", arr);


	return 0;
}

                                                                                                                                                                                         

#include<stdio.h>
#include<string.h>
//前后都能拷贝的memcpy
void my_memcpy(void* arr1, const void* arr2, int n)
{
	void* arr0 = arr1;
	if (arr2 > arr1)
	{
		while (n--)
		{

			*(char*)arr0 = *(char*)arr2;
			arr0 = (char*)arr0 + 1;
			arr2 = (char*)arr2 + 1;
		}
	}
	else
	{
		while (n--)
		{
			*((char*)arr1 + n) = *((char*)arr2 + n);
		}
	}


}

int main()
{
	

	char arr1[] = "123456789";
	char arr2[] = "345";
	int n = sizeof(arr2);
	
	memcpy(arr1 , arr1+2, 3);
	printf("%s", arr1);


	return 0;
}

                                                                                                                                                                                                                       

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值