1. memcpy使用和模拟实现
1.1memcpy
函数原型
void * memcpy ( void * destination, const void * source, size_t num );
功能:
1.memcpy 是完成内存块拷⻉的,不关注内存中存放的数据是啥
2.函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存位置。
3.如果 source 和 destination 有任何的重叠,复制的结果都是未定义的
参数:
destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥
source :指针,指向源空间,要拷⻉的数据从这⾥来
num :要拷贝的数据占据的字节数
返回值:
拷贝完成后,返回⽬标空间的起始地址
代码演示
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 20);
int sz = sizeof(arr2) / sizeof(int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}

1.2 memcpy的模拟实现
void* my_memcpy(void* destination, void* source, size_t num)
{
void* ret = destination;
while (num–)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
return ret;
}
分析:void*指针需转化成其他类型指针才能操作,char*指针操作1个字节,更加精细化,就是把要拷贝的数据分成多个字节,进行改动。
2. memmove
2.1memmove
函数原型
void * memmove ( void * destination, const void * source, size_t num );
功能:
1.memmove函数也是完成内存块拷⻉的
2.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
参数:
destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥
source :指针,指向源空间,要拷⻉的数据从这⾥来
num :要拷⻉的数据占据的字节数
返回值:
拷⻉完成后,返回⽬标空间的起始地址
总结:由于不需要管内存是否重叠,memmove的使用场景,跟加广泛
3.memset
3.1memset
函数原型
void * memset ( void * ptr, int value, size_t num );
功能:
memset 函数是⽤来设置内存块的内容的,将内存中指定⻓度的空间设置为特定的内容。
参数:
ptr :指针,指向要设置的内存空间,也就是存放了要设置的内存空间的起始地址。
value :要设置的值,函数将会把 value 值转换成 unsigned char 的数据进⾏设置的。也就是以字节为单位来设置内存块的。
num :要设置的内存⻓度,单位是字节。
返回值:返回的是要设置的内存空间的起始地址。
代码演示
int main()
{
char arr[] = "hello world";
memset(arr, 'x', 5);
printf("%s", arr);
return 0;
}

总结:当有⼀块内存空间需要设置内容的时候,就可以使⽤memset函数,值得注意的是memset函数对内存 单元的设置是以字节为单位的。
举例
int arr[] = { 1,2,3,4,5 };
memset(arr, 1, 5);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}

原因:由于1的16进制存储为01 00 00 00 memset改动的单位是1个字节,所以1变为01 01 01 01
刚好就图中的16843009
4.memcmp
4.1memcmp
函数原型
int memcmp ( const void * ptr1, const void * ptr2, size_t num );

代码演⽰
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,3,40,5 };
int r1 = memcmp(arr1, arr2, 12);
int r2 = memcmp(arr1, arr2, 16);
printf("%d %d", r1,r2);



