【编程之路(013)内存相关函数】(C语言实现)

内存相关的函数这篇博客介绍三个——memcpy,memmove,memcmp。

目录

1.复制所有类型——memcpy:

memcpy函数介绍:

memcpy函数的演示:

memcpy函数的模拟实现:

2.移动内部数据——memmove:

memmove函数介绍:

memmove函数演示:

memmove函数的模拟实现:

 3.比较各种数组——memcmp

memcmp函数介绍:

memcmp函数演示:

memcmp函数的模拟实现:


1.复制所有类型——memcpy:

memcpy函数介绍:

所需要的头文件

 

 返回类型:是被复制到目标空间的起始地址。

 参数类型:

第一个参数:是被复制到目标空间的起始地址。

第二个参数:所要复制的字符的起始地址。

第三个参数:复制字符的字节数。

使用void*的原因是,它具有包容性,无论是什么类型的数据都可以。

memcpy函数的演示:

#include<stdio.h>
#include<string.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int cpy[] = { 0,0,0,0,0,0 };
    //复制从cpy的前3个数到arr中去
	memcpy(arr, cpy, 12);

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

 memcpy函数的模拟实现:

#include<stdio.h>
#include<assert.h>

void* my_memcpy(void* des, const void* src, size_t n)
{
	//判断指针的有效性
	assert(des && src);

	//因为要返回起始地址,但是改地址会改变,所以先记录一下
	void* ret = des;

	while (n--)
	{
		//void*是空类型,必须得强制转换成其他有意义的类型
		//才可以做相关的解引用和加减整数操作
		*(char*)des = *(char*)src;
		des = (char*)des + 1;
		src = (char*)src + 1;
	}

	return ret;
}


int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int cpy[] = { 0,0,0,0,0,0 };
	my_memcpy(arr, cpy, 12);

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

	return 0;
}

 


2.移动内部数据——memmove:

memmove函数介绍:

所需头文件: 

 

 返回类型:是被复制到目标空间的起始地址。

 参数类型:

第一个参数:是被复制到目标空间的起始地址。

第二个参数:所要复制的字符的起始地址(还是在该空间)。

第三个参数:复制字符的字节数。

memmove函数演示:

#include<stdio.h>
#include<string.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr, arr+2, 16);
	//把3,4,5,6移到arr的起始位置
	//应该是3,4,5,6,6,7,8,9,10

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

	return 0;
}

 

 memmove函数的模拟实现:

 

 

#include<stdio.h>
#include<assert.h>

void* my_memmove(void* des, const void* src, size_t n)
{
	//判断指针的合法性
	assert(des && src);

	//返回des的地址,提前保存
	void* ret = des;

	//des<src==>从前向后移动
	if (des < src)
	{
		while (n--)
		{
			//同上
			*(char*)des = *(char*)src;
			des = (char*)des + 1;
			src = (char*)src + 1;
		}
	}
	//从后向前移动
	else
	{
		while (n--)
		{
            //n进来之后就是15,刚好从最后面开始,随着自减,就都能覆盖完成
			*((char*)des + n) = *((char*)src + n);
		}
	}

	return ret;
}


int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr, arr + 2, 16);
	//把3,4,5,6移到arr的起始位置
	//应该是3,4,5,6,5,6,7,8,9,10

	my_memmove(arr + 4, arr + 2, 16);
	//把3,4,5,6移到arr+4的位置
	//应该是1,2,3,4,3,4,5,6,9,10
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

	return 0;
}

 


 3.比较各种数组——memcmp

memcmp函数介绍:

需要的头文件 

 

 可以看出,它与之前的字符串比较函数非常像,只不过它可以比较的数据类型由于是void*,从而使得它有了更多的使用范围。

memcmp函数演示:

#include<stdio.h>
#include<string.h>

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,8,1 };

	int ret = memcmp(arr1, arr2, 12);
	if (ret > 1)
	{
		printf("arr1>arr2\n");
	}
	else if (ret == 0)
	{
		printf("arr1==arr2\n");
	}
	else
	{
		printf("arr1<arr2\n");
	}

	return 0;
}

memcmp函数的模拟实现:

#include<stdio.h>

int my_memcmp(const void* arr1, const void* arr2, size_t n)
{
	while (n--)
	{
		if (*(char*)arr1 != *(char*)arr2)
		{
			return (*(char*)arr1 - *(char*)arr2);
		}
		else
		{
			arr1 = (char*)arr1 + 1;
			arr2 = (char*)arr2 + 1;
		}
	}
	return 0;
}

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 9,0,0,1 };

	int ret = my_memcmp(arr1, arr2, 12);
	if (ret > 0)
	{
		printf("arr1>arr2\n");
	}
	else if (ret == 0)
	{
		printf("arr1==arr2\n");
	}
	else
	{
		printf("arr1<arr2\n");
	}

	return 0;
}

 

有什么问题希望评论区指出。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值