memcpy库函数
void * memcpy ( void * destination, const void * source, size_t num );
将source指针指向数组的内容拷贝到destination指针指向的数组内容,实现数组的复制。但memcpy不能实现数组内部拷贝,内部拷贝数组会被覆盖。size_t num指的是拷贝的字节数,因为memcpy函数内部是一字节一字节进行拷贝。
代码实现
int main()
{
int arr1[] = { 1,2,3,4,5,6 };
int arr2[20] = {0};
memcpy(arr2, arr1, sizeof(arr1));
for (int i = 0; i < 6; i++)
{
printf("%d ", arr2[i]);//打印arr2的内容。
}
return 0;
}
模拟实现memcpy
因为memcpy是以字节之间拷贝的,因为memcpy是能拷贝任何类型的数组,因此我们用void空指针去接收,但空指针不能进行运算操作。因此2点我们将其强转成char类型的指针。
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
while (num--)
{
(char*)dest = (char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[6] = { 1,2,3,4,5,6 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1, sizeof(arr1));
for (int i = 0; i < 6; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
memmove库函数
void * memmove ( void * destination, const void * source, size_t num ); memmove库函数解决了memcpy的深覆盖问题,无发在自身数组进行拷贝问题。
代码实现
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9 };
memmove(arr1+2,arr1,20);//arr1指向的数组的位置后面的20个字节
for (int i = 0; i < 9; i++)
{
printf("%d ", arr1[i]);//结果1 2 1 2 3 4 5 8 9
}
return 0;
}
模拟实现memmove
void* my_memmove(void* dest, void* src, size_t num)
{
void* ret = dest;
if (dest < src)
{
while (num--)
{
//前到后
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)dest + 1;
}
}
else
{
while (num--)
{
//后到前
*((char*)dest + num) = *((char*)src + num);
}
}
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9 };
my_memmove(arr1 + 2, arr1, 20);//arr1+2指向的数组的位置后面的5个数
for (int i = 0; i < 9; i++)
{
printf("%d ", arr1[i]);//结果1 2 1 2 3 4 5 8 9
}
return 0;
}