库函数memcpy的实现

1.先看一下memcpy的声明

  从str2所指向的内容的n个字节复制到str1所指向的内容中,注意这里是n个字节,后面实现该库函数时我会详细解释.size_t你们可以查一下它的定义,代表着无符号整型.

2.好,来看看我们如何实现它

void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	//有多少个字节执行多少次
	while (num--)
	{
		//一个字节一个字节进行赋值
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}

  这里你应该要产生一种疑问,为什么我们实现该库函数时,它的参数类型为什么要这样设置,难道就是简单地模仿?其实当你用这个库函数时,你会发现,它不仅可以实现数组之间的拷贝,字符串之间的拷贝,结构体数组的拷贝......你想想实现它要接受多少不同类型的地址(是整型的还是字符型的还是其它),所以我们在参数中用到了void *,因为它可接受任何类型的地址。好,这个问题解决了,又有一个问题来了,怎样去实现拷贝?

  我们知道不同的数据类型,它所占的空间大小也不一样,所以(这里我直接说,后面会有具体实现的效果,好好去看一下那几个例子)我们一个字节一个字节地拷贝,化大为小,每块个小的一样,大的也就一样了.

3.例子1

void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	//有多少个字节执行多少次
	while (num--)
	{
		//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[5] = { 0 };
	//将数组arr1的内容拷贝到arr2数组中,arr1数组大小为20个字节所以执行我们的函数20次
	my_memcpy(arr2, arr1, sizeof(arr1));
	//打印数组arr2
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
}

3.1例子2

void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	//有多少个字节执行多少次
	while (num--)
	{
		//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}
int main()
{
	char arr1[] = "abcde";
    char arr2[10] = "hahahs";
    char* ret = (char*)my_memcpy(arr2, arr1, sizeof(arr1) - 1);
	//返回了字符串首地址这就是void* ret = dest的作用
    printf("%s\n", ret);
}

3.1例子3

#include <assert.h>
struct s
{
	int age;
	char name[20];
};
void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	//有多少个字节执行多少次
	while (num--)
	{
		//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}
int main()
{
	struct s arr3[] = { {20,"张三"},{30,"李四"} };
    struct s arr4[4] = { 0 };
    my_memcpy(arr4, arr3, sizeof(arr3));
	for (int i = 0; i < 2; i++)
	{
		printf("%d %s\n", arr4[i].age, arr4[i].name);
	}
}

4总结

希望各位佬们提提建议,感谢阅读,点个赞吧.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值