目录
1.memcpy
使用
模拟实现
2.memmove
使用
模拟实现
3.memset
使用
4.memcmp
使用
1.memcpy
使用
void * memcpy ( void * destination, const void * source, size_t num );目的地址 源地址 字节数
destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。
source:指向要复制的数据源的指针,类型转换为const void*类型的指针。
num:要复制的字节数。size_t是一个无符号整数类型。
1.函数memcpy从源地址(destimation)的位置开始向后复制num个字节的数据到目的地址(source)指向的内存位置
2.这个函数在遇到 '\0' 的时候并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未定义的。
演示:
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);//从arr1->arr2 20个字节int i = 0;
//这里打印10个方便查看for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}
结果:
模拟实现
void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest);//判断是否为空assert(src);void* ret = dest;//防止返回的地址变动
//逐个传入while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return(ret);
}
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };my_memcpy(arr2, arr1, 20);//从arr1->arr2 20个字节int i = 0;
//这里打印10个方便查看for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}
结果:
2.memmove
使用
其实跟memcpy差不多
void * memmove ( void * destination, const void * source, size_t num );目的地址 源地址 字节数
destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。
source:指向要复制的数据源的指针,类型转换为constvoid*类型的指针。
num:要复制的字节数。size t是一个无符号整数类型。
1.将num字节的值从源地址指向的位置复制到目的地址指向的内存块。
2.复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。
3.当源地址看见和目标地址出现重叠,可以使用memmove
演示一下,如何重叠的
将源地址的数据传入源地址内(实现在同一个看见重叠)
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//将源地址数据传入(源地址+2) 发生重叠memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}
这里传入的20个字节 从(arr+2)开始 后面20个字节进行重叠
模拟实现
void* my_memmove(void* dest, const void* src, size_t count)
{assert(src);//判断是否为空void* ret = dest;//防止返回的地址变动
//这里进行判断位置 从哪里开始进行替换if (dest <= src || (char*)dest >= ((char*)src + count)) {while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else {dest = (char*)dest + count - 1;src = (char*)src + count - 1;while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest - 1;src = (char*)src - 1;}}return(ret);
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}
结果:
3.memset
使用
void * memset ( void * ptr, int value, size_t num );源地址 要变的内容 字节数
ptr指针,指向要填充的内存块。
value:进行设置。该值以int形式传递,但函数使用该值的无符号字符转换填充内存块。
num:要设置为值的字节数。size_t是一个无符号整数类型。
1.设置内存,将内存中的值以字节为单位设置成想要的内容。
这里就不模拟了(循环替换)
int main()
{char str[] = "hello qingtian";memset(str, 'x', 5);printf(str);return 0;
}
结果:
4.memcmp
使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );地址1 地址2 字节数
ptr1:内存块的指针。
ptr2:内存块的指针。
num:要比较的字节数。
1.进行比较ptr1和ptr2 从0开始比较num个
int main()
{char arr1[] = "abcdef";char arr2[] = "abdd";int n;n = memcmp(arr1, arr2, sizeof(arr2));if (n > 0)printf("'%s' 大于 '%s'\n", arr1, arr2);else if (n < 0)printf("'%s' 小于 '%s'\n", arr1, arr2);elseprintf("'%s' 等于 '%s'\n", arr1, arr2);return 0;
}