内存操作函数
1.memcpy
memcpy函数,可复制任何类型数据,strcpy只能复制字符串
//先使用
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
int sz = sizeof(arr1) / sizeof(arr1[0]);
memcpy(arr2, arr1, 40);
int i = 0;
for (i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
我们再来模仿实现
void* my_memcpy(void *dest,const void* src, size_t num)
{
void* ret = dest;
assert(src && dest);
while (num--)
{
*(char*)dest = *(char*)src;
//强制类型转换只是暂时的,它只能是放在它前面的时候强转一次
dest = (char*)dest + 1;
src = (char*)src + 1;
//所以上面两句代码,就最好不要写成 (char*)dest++或者是++(char*)
}
return ret;
}
//int main()
//{
// int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
// int arr2[20] = { 0 };
// int sz = sizeof(arr1) / sizeof(arr1[0]);
// my_memcpy(arr2, arr1, 40);
// int i = 0;
// for (i = 0; i < 20; i++)
// {
// printf("%d ", arr2[i]);
// }
// //可以用mymcpy函数把数组arr1的1,2,3,4,5拷贝到3,4,5,6,7处吗?
// //下面的代码告诉了我们,不可以。mymcpy函数是不可以处理重叠内存的数据拷贝的,只能处理不相关的两个内存
// /*my_memcpy(arr1 + 2, arr1, 10);
// int i = 0;
// for (i = 0; i < 20; i++)
// {
// printf("%d ", arr1[i]);
// }*/
// return 0;
//}
// //但memmove函数可以来完成这项任务
2.memmove
memmove函数可以拷贝重叠数据
先使用
//int main()
//{
// int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
// memmove(arr1 + 2, arr1, 10);
// int i = 0;
// for (i = 0; i < 10; i++)
// {
// printf("%d ", arr1[i]);
// }
// 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*)src + 1;
}
}
else
{
//从后往前
while (num--)
{
*((char*) dest + num) =*( (char*)src + num);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1 + 2, arr1, 10);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}