三个参数,第一个是 目标空间的首元素地址,第二个是内容空间的首元素地址,第三个是要移动的内容的字节数,返回空类型指针。
这个函数就是memcpy的升级版,可以自己错位移动自己,这里需要分两种情况讨论。设第一个数组是arr1,第二个是arr2,如果arr1 > arr2(地址大小),那么需要从后往前移动,反之,则从前往后移动,一次移动一个字节。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void* my_memmove(void* arr1, const void* arr2, int num)
{
assert(arr1 && arr2);
void* p = arr1;
if (arr1 < arr2) //从前往后
{
for (int i = 0; i < num; i++)
{
*((char*)arr1)++ = *((char*)arr2)++;
}
}
else if (arr1 > arr2) //从后往前
{
for (int i = 0; i < num; i++)
{
*((char*)arr1 + num - 1) = *((char*)arr2 + num - 1);
--(char*)arr1;
--(char*)arr2;
}
}
return p;
}
int main()
{
int arr1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int arr2[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
my_memmove(arr1 + 2, arr1 + 4, 16);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
my_memmove(arr2 + 4, arr2 + 2, 16);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
printf("\n");
system("pause");
return 0;
}