模拟实现memmove

void* my_memmove(void*dest, void*src, size_t n)//从src指向的字节开始复制n个字节到dest指向的字节处
{
	char*p = (char*)dest;
	char*q = (char*)src;
	while (dest <= src && n--)
	{
		*p = *q;
		p++; q++;
	}

	//if (dest > src)//当if的条件成立执行的操作不需要循环就不要放在while里。
	//{
	//	p = p + n - 1; //首先要改掉第n个字节(要复制n个最后一个就是第n个即p+n-1)
	//	q = q + n - 1;
	//	while (n--) //循环n次,下面是交换n次。因为有n个字节。
	//	{
	//		*p = *q;
	//		p--; q--;
	//	}
	//}//下面是简版。
	while (dest > src && n--)   /*判断条件的时候n确实是20,先使用再减减,判断完条件即使用完,进入循环时已经是19了。*/
	{
	*(p + n-1) = *(q + n-1);//这里是错的为了记住就写成这样,所以这里写成p+n就可以了

	}
	return dest;
}

int main()
{
	int i = 0;
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	int* p = (int*)my_memmove(arr+2, arr, 20);//下面不能用p[i]来打印,p作为起始地址时,他后面已知元素是不够10个的,如果这样打印会非法访问。因为后面的指针相当于未初始化,指向未知。
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值