当前位置:   article > 正文

C语言中的内存函数你知道多少呢?

C语言中的内存函数你知道多少呢?

目录

 ​编辑

1. memcpy的使用和模拟实现

1.1函数介绍

​编辑

1.2函数的使用

1.3模拟实现

2. memmove的使用和模拟实现

2.1函数介绍

2.2函数的使用

2.3模拟实现

3. memset函数的使用

3.1函数介绍

3.2函数的使用

​编辑

4. memcmp函数的使用

4.1函数介绍

4.2函数的使用

完结散花


 

                           不是每个人都能做自己想做的事,成为自己想成为的人。

                                                  克心守己,律己则安

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~ 

1. memcpy的使用和模拟实现

1.1函数介绍

注:使用该函数需要引用头文件#include<string.h> 

1.2函数的使用

假设我们要将arr1中的前20个字节拷贝到数组arr2中~

  1. int main()
  2. {
  3. int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
  4. int arr2[10] = { 0 };
  5. memcpy(arr2, arr1, 20);
  6. for (int i = 0; i < 5; i++)
  7. {
  8. printf("%d ", arr2[i]);
  9. }
  10. return 0;
  11. }

 运行效果如下~

我们可以看到屏幕上打印了1 2 3 4 5 ~怎么样,使用是不是很简单呢?

1.3模拟实现

那让我们模拟实现一下这个函数,相信我们会对其有更加深刻的理解呢~

.  模拟实现之前我们还要了解一下指针类型void*

.  当我们无法确定传递过来的实参的指针是什么类型时,我们就可以用void*来接受

.  但我们还要知道的一点是对于指针void*,我们无法对其进行指针运算

  1. void* my_memcpy(void* dest, const void* src, size_t num)
  2. {
  3. assert(dest && src);//判断指针的有效性
  4. void* ret = dest;//用ret记录dest目标函数的起始位置
  5. while (num--)
  6. {
  7. //强制类型转化为char*对其进行指针运算
  8. *(char*)dest = *(char*)src;
  9. dest = (char*)dest + 1;
  10. src = (char*)src + 1;
  11. //*((char*)dest)++ = *((char*)src)++;这种写法在VS2022上可行,但不能确保所有编译器上都可行
  12. }
  13. return ret;
  14. }

2. memmove的使用和模拟实现

2.1函数介绍

2.2函数的使用

  1. int main()
  2. {
  3. int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
  4. int arr2[10] = { 0 };
  5. memmove(arr1+2, arr1, 20);
  6. for (int i = 0; i < 10; i++)
  7. {
  8. printf("%d ", arr1[i]);
  9. }
  10. return 0;
  11. }

我们来看一下运行效果~

2.3模拟实现

那让我们模拟实现一下这个函数,相信我们会对其有更加深刻的理解呢~

  1. void* my_memmove(void* dest, const void* src, size_t num)
  2. {
  3. assert(dest && src);
  4. void* ret = dest;
  5. if (src>dest)//从前往后复制
  6. {
  7. while (num--)
  8. {
  9. *(char*)dest = *(char*)src;
  10. dest = (char*)dest + 1;
  11. src = (char*)src + 1;
  12. }
  13. }
  14. else//从后往前复制
  15. {
  16. dest = (char*)dest + num-1;
  17. src = (char*)src + num-1;
  18. while (num--)
  19. {
  20. *(char*)dest = *(char*)src;
  21. dest = (char*)dest - 1;
  22. src = (char*)src - 1;
  23. }
  24. //while (num--)
  25. //{
  26. // *((char*)dest + num) = *((char*)src + num);
  27. //}这样写也行
  28. }
  29. return ret;
  30. }

 算法的图解放在下面啦~

3. memset函数的使用

3.1函数介绍

3.2函数的使用

  1. int main()
  2. {
  3. int arr[10] = { 0 };
  4. memset(arr, 1, 20);
  5. return 0;
  6. }

调试我们看一下效果~

是不是很简单呢~


4. memcmp函数的使用

4.1函数介绍

4.2函数的使用

  1. int main()
  2. {
  3. int arr1[10] = { 1,2 };
  4. int arr2[10] = { 1,3 };
  5. printf("前4个字节比较%d\n", memcmp(arr1, arr2, 4));
  6. printf("前5个字节比较%d\n", memcmp(arr1, arr2, 5));
  7. printf("前8个字节比较%d\n", memcmp(arr1, arr2, 8));
  8. return 0;
  9. }

我们来看一下运行效果~

完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/123549
推荐阅读
相关标签
  

闽ICP备14008679号