一.memcpy使用和模拟实现
1.memcpy的使用


cpp
#include <string.h>
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = {0};
//将arr1中的1 2 3 4 5,拷贝到arr2中
memcpy(arr2, arr1, 5*sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
cpp
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
//将arr1中的4 5 6 7 8,拷贝到arr2中
memcpy(arr2, arr1+3, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}

cpp
int main()
{
char arr1[10] = "he\0lo bit";
char arr2[10] = { 0 };
//将arr1中的4 5 6 7 8,拷贝到arr2中
memcpy(arr2, arr1, 5);
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%c ", arr2[i]);
}
return 0;
}

2.memcpy的模拟实现
cpp
void* my_memcpy(void* dest, const void* src, size_t num)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src + 1;
}
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
//将arr1中的4 5 6 7 8,拷贝到arr2中
my_memcpy(arr2, arr1+3, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
cpp
void* my_memcpy(void* dest, const void* src, size_t num)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src + 1;
}
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memcpy(arr1, arr1+3, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
cpp
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}

但是自己和自己进行拷贝的时候,会发生覆盖,结果并不对
二.memmove使用和模拟实现
1.memmove的使用
有重复的拷贝的情况,就使用我们的memmove


cpp
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1+2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}

2.memmove的模拟实现
cpp
void* my_memmove(void* dest, const void*src, size_t num)
{
void* ret = dest;
assert(dest && src);
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[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1, arr1+2, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);// 1 2 1 2 3 4 5 8 9 10
}
return 0;
}

三.memset函数的使用

cpp
//memset - 内存设置
int main()
{
char arr[10] = "hello bit";
memset(arr, 'x', 5);
//memset 在设置的时候,是以字节为单位来设置的
//
printf("%s\n", arr);
return 0;
}
cpp
int main()
{
int arr[10] = { 0 };
memset(arr, 1, 40);
return 0;
}


四.memcmp函数的使用

cpp
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 1,2,3,4,8 };
int ret = memcmp(arr1, arr2, 17);
printf("%d\n", ret);
return 0;
}