一、 memcpy
1. 定义
我们昨天介绍了字符串函数的拷贝 以及带有限制的字符串函数的拷贝
这个函数其实和我们带有限制的字符串函数的拷贝差不多
只不过这里传递进来的参数是void类型的 这样就能够接受所有类型的指针进来了
我们可以来尝试下这段代码
我们可以发现的是 这一段代码是可以完美运行的
2. 模拟实现
代码表示如下
void* my_memcpy(void* dest, const void* src, size_t num) { assert(dest && src); void* ret = dest; while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; } void test1() { int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; //内存拷贝 memcpy //int* int* my_memcpy(arr2, arr1 + 2, 17); }
实现结果如下
我们发现 这样子是可以完美运行的
二、 memmove
1. 定义
其实memmove就是memcpy的升级版
我们可以发现 当我们想要移动数组本身的时候 其实memcpy并不能很好的执行
2. 实现
这是为什么呢 ?
我们画图来解释下
那么 代码表示如下
void* my_memmove(void* dest, const void* src, size_t num) { assert(dest && src); 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); } }
我们可以发现 是可以完美运行的
三. memcmp
1. 定义
我们可以发现的是 这个和我们以前写的strncpy也差不了多少
我们来使用这个函数看看
我们可以发现 如果arr1大于arr2就返回1
如果arr1小于arr2就返回-1
如果arr1==arr2就返回0
2. 模拟实现
那么 我们来尝试模拟实现以下这个函数
代码表示如下
实现结果如下
四. memset
1.定义
memset可以将一个数组的前x个元素额设置成一个值
2. 实现
代码表示如下
int main() { char arr[] = "hello world"; memset(arr, 'x', 5); printf("%s\n", arr); memset(arr + 6, 'y', 5); printf("%s\n", arr); return 0; }
实现效果如下
完美实现
以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言