memmove函数
头文件:<string.h>
函数功能:将从源地址source开始的num个字节移动至目标地址destination处【可用于源地址与目标地址内存重叠的情况】
函数参数以及返回类型:void* memmove(void* destination, const void* source, size_t num)
参数解释:
1.因为不知道要移动的参数是什么类型,所以源地址source的指针类型设定为无类型指针;
2.用const来保护源地址处的数据,防止被篡改;
3.函数的返回类型是目标地址的指针类型,定义为无类型指针;
函数使用:
源数据数组:arr[10]={1,2,3,4,5,6,7,8,9,10}
将数组中的第1-4个位置的元素复制移动到数组对的第2-5元素的位置
目标数据数组:arr[10]={1,1,2,3,4,5,7,8,9,10}
代码实现:
#include <stdio.h>
#include <string.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr+1, arr, 20);
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
代码实现memmove函数的功能:
#include <stdio.h>
#include <assert.h>
#include <string.h>
void* my_memmove(void* dest, const void* sour, size_t num)
{
void* temp = dest;
assert(dest && sour);
char* dest1 = (char*)dest;
char* sour1 = (char*)sour;
//判断源地址和目标地址的大小,决定是倒序复制还是正序复制
if (dest1 > sour1)
{
//倒序复制
while (num--)
{
*(dest1 + num) = *(sour1 + num);
}
}
else if (dest1 < sour1)
{
//正序复制
while (num--)
{
*(dest1) = *(sour1);
dest1++;
sour1++;
}
}
return temp;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr+1, arr, 20);
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
注意事项:
1.将源地址和目标地址的指针转化为字符指针类型,确保+1时,步长为1,跳过1个字节
2.判断源地址source和目标地址destination的相对大小,进而选择正序或者逆序的方式赋值:当源地址source大于目标地址destination时,为了防止源地址起始处的数据被覆盖,应选择正序赋值,也就是先从源数据的首端开始赋值,反之,相反。
3.源地址加num-1个字节时,指向的是最后一个数据,while(n--)中拿n判断,拿n-1使用;
特别鸣谢:哔哩哔哩比特鹏哥的视频教程
本文含有隐藏内容,请 开通VIP 后查看