memcpy和memmove两个函数都是内存操作函数
这是memcpy函数的介绍
用库函数实现数组(或者字符串也一样)局部复制,最后一个参数 为第二个地址参数 要跳跃多少个字节的字节数。 然后将第二个参数的数组所跳跃的 每一个 字节的数据都 复制到第一个数组里。
其实按理来说memcpy其实是从前向后复制的,但是编译器对于memcpy的优化让memcpy也有从后向前复制功能,具有能判断什么时候 从前向后复制 或者 从后向前复制(memmove这个函数也是一样 原本是从后向前复制的功能 vs编译器优化使得它也一样)
接下来自行实现
#include<stdio.h>
#include<string.h>
void my_memcpy(void* arr1, const void* arr2,int n)
{
void* arr0 = arr1;
while (n--)
{
*(char*)arr0 = *(char*)arr2;
arr0 = (char*)arr0 + 1;
arr2 = (char*)arr2 + 1;
}
}
int main()
{
//从前往后拷贝
int arr1[] = { 1,2,3,4,5,6,7,8,9 ,0};
my_memcpy(arr1+2, arr1,3*4);
//memcpy(arr1+2, arr1,3*4);
for (int i = 0; i < sizeof(arr1)/sizeof(arr1[0]); i++)
printf("%d ", arr1[i]);
return 0;
}
#include<stdio.h>
#include<string.h>
void my_memmove(void* arr1,const void* arr2, int n)
{
//从后向前拷贝
while (n--)
{
*((char*)arr1 + n) = *((char*)arr2+n);
}
}
int main()
{
char arr[] = "123456789";
//memmove(arr, arr + 2,3);
my_memmove(arr , arr+2, 3);
printf("%s", arr);
return 0;
}
#include<stdio.h>
#include<string.h>
//前后都能拷贝的memcpy
void my_memcpy(void* arr1, const void* arr2, int n)
{
void* arr0 = arr1;
if (arr2 > arr1)
{
while (n--)
{
*(char*)arr0 = *(char*)arr2;
arr0 = (char*)arr0 + 1;
arr2 = (char*)arr2 + 1;
}
}
else
{
while (n--)
{
*((char*)arr1 + n) = *((char*)arr2 + n);
}
}
}
int main()
{
char arr1[] = "123456789";
char arr2[] = "345";
int n = sizeof(arr2);
memcpy(arr1 , arr1+2, 3);
printf("%s", arr1);
return 0;
}