1. memcpy的使用和模拟实现
1.1函数介绍
注:使用该函数需要引用头文件#include<string.h>
1.2函数的使用
假设我们要将arr1中的前20个字节拷贝到数组arr2中~
int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; memcpy(arr2, arr1, 20); for (int i = 0; i < 5; i++) { printf("%d ", arr2[i]); } return 0; }
运行效果如下~
我们可以看到屏幕上打印了1 2 3 4 5 ~怎么样,使用是不是很简单呢?
1.3模拟实现
那让我们模拟实现一下这个函数,相信我们会对其有更加深刻的理解呢~
. 模拟实现之前我们还要了解一下指针类型void*
. 当我们无法确定传递过来的实参的指针是什么类型时,我们就可以用void*来接受
. 但我们还要知道的一点是对于指针void*,我们无法对其进行指针运算的
void* my_memcpy(void* dest, const void* src, size_t num) { assert(dest && src);//判断指针的有效性 void* ret = dest;//用ret记录dest目标函数的起始位置 while (num--) { //强制类型转化为char*对其进行指针运算 *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; //*((char*)dest)++ = *((char*)src)++;这种写法在VS2022上可行,但不能确保所有编译器上都可行 } return ret; }
2. memmove的使用和模拟实现
2.1函数介绍
2.2函数的使用
int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; memmove(arr1+2, arr1, 20); for (int i = 0; i < 10; i++) { printf("%d ", arr1[i]); } return 0; }
我们来看一下运行效果~
2.3模拟实现
那让我们模拟实现一下这个函数,相信我们会对其有更加深刻的理解呢~
void* my_memmove(void* dest, const void* src, size_t num) { assert(dest && src); void* ret = dest; if (src>dest)//从前往后复制 { while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else//从后往前复制 { dest = (char*)dest + num-1; src = (char*)src + num-1; while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest - 1; src = (char*)src - 1; } //while (num--) //{ // *((char*)dest + num) = *((char*)src + num); //}这样写也行 } return ret; }
算法的图解放在下面啦~
3. memset函数的使用
3.1函数介绍
3.2函数的使用
int main() { int arr[10] = { 0 }; memset(arr, 1, 20); return 0; }
调试我们看一下效果~
是不是很简单呢~
4. memcmp函数的使用
4.1函数介绍
4.2函数的使用
int main() { int arr1[10] = { 1,2 }; int arr2[10] = { 1,3 }; printf("前4个字节比较%d\n", memcmp(arr1, arr2, 4)); printf("前5个字节比较%d\n", memcmp(arr1, arr2, 5)); printf("前8个字节比较%d\n", memcmp(arr1, arr2, 8)); return 0; }
我们来看一下运行效果~