温州做网站哪儿,怎么打开wordpress后台,文山app开发定制,电商新手入门教程欢迎来CILMY23的博客喔#xff0c;本篇为【C语言】内存操作#xff0c;内存函数篇---memcpy#xff0c;memmove#xff0c;memset和memcmp内存函数的使用和模拟实现【图文详解】#xff0c;图文讲解四种内存函数#xff0c;带大家更深刻理解C语言中内存函数的操作… 欢迎来CILMY23的博客喔本篇为【C语言】内存操作内存函数篇---memcpymemmovememset和memcmp内存函数的使用和模拟实现【图文详解】图文讲解四种内存函数带大家更深刻理解C语言中内存函数的操作感谢观看支持的可以给个一键三连点赞关注收藏。 前言 在结束上一期字符系列篇后本篇我们将了解四种内存操作的函数它们分别是memcpymemmovememset和memcmp。 目录
一、memcpy
memcpy的介绍和使用 memcpy的模拟实现
二、memmove memmove的介绍和使用 memmove的模拟实现
三、memset
四、memcmp 一、memcpy memcpy可以在cplusplus网站查询memcpy - C Reference (cplusplus.com)
函数原型如下
void * memcpy ( void * destination, const void * source, size_t num );
函数介绍如下 函数返回值和使用案例如下 memcpy的介绍和使用 memcpy是一个复制内存空间的函数Copy block of memory复制内存块将 num 字节的值从源指向的位置直接复制到目标指向的内存块。
那具体是怎么使用的呢
我们来看一个整型数组的使用案例
#includestdio.h
#includestring.hint main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[60];memcpy(arr2, arr1, 20);for (int i 0; i 5; i){printf(%d, arr2[i]);}return 0;
}
结果如下 memcpy的模拟实现 思路 因为我们并不知道要接收什么样的数据类型所以可以用void *来定义数据类型因为void*不能直接加减整数所以我们要将其转换成char * 的一个字节指针变量然后进行加减最后赋值给自己。 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;
} 写完后我们看案例如果目标空间和源空间重叠了呢
#includestdio.h
#includestring.hint main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[60];memcpy(arr13, arr1, 20);for (int i 0; i 5; i){printf(%d, arr1[i]);}return 0;
}
结果如下
我们用自己的拷贝呢
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };my_memcpy(arr13, arr1, 20);for (int i 0; i 10; i){printf(%d , arr1[i]);}return 0;
}
结果如下 我们来看过程图 总结 1.memcpy的使用需要包括头文件string.h 2.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 3.memcpy函数在遇到 \0 的时候并不会停下来。 4.如果source和destination有任何的重叠复制的结果都是未定义的。 5.memcpy的返回值是目标空间的起始地址 二、memmove
为了解决上述情况我们需要用到memmove来解决内存重叠的问题memmove可以在cplusplus网站查询memmove - C Reference (cplusplus.com)
函数原型如下
void * memmove ( void * destination, const void * source, size_t num );
函数介绍如下 函数返回值和使用案例如下 memmove的介绍和使用 memmove可以解决出现内存重叠空间的情况将 num 字节的值从源指向的位置复制到目标指向的内存块。复制就像使用中间缓冲区一样进行从而允许目标和源重叠。
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };memmove(arr13, arr1, 20);for (int i 0; i 10; i){printf(%d , arr1[i]);}return 0;
}
结果如下 memmove的模拟实现 思路为了解决重叠问题我们得对src和dest的目标空间起始位置进行讨论分两种情况从后往前或者从前往后复制 我们发现当dest在src的右边就需要从后往前拷贝 而dest在src的左边就需要从前往后拷贝 当dest和src不重叠的时候无论是从前往后还是从后往前都可以。 所以一共有两种方案 方案一我们采取dest在src前面的情况然后其余只采用从后往前 方案二、我们采取dest src并且dest (char*)src num, //方案一
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);}}return ret;
}
//方案二
void* my_memmove(void* dest, const void* src, size_t num)
{assert(dest src);void* ret dest;if (dest src dest (char*)src num){//从后向前while (num--){*((char*)dest num) *((char*)src num);}}else{//从前向后while (num--){*(char*)dest *(char*)src; dest (char*)dest 1;src (char*)src 1;}}return ret;
}
二者最后的结果如下所示 总结 1.如果源空间和⽬标空间出现重叠就得使用memmove函数处理。 2.memmove的使用需要包括头文件string.h 3.memmove将 num 字节的值将源指向的位置复制到目标指向的内存块。复制就像使用中间缓冲区一样进行从而允许目标和源空间重叠。 4.memmove和memcpy函数一样在遇到 \0 的时候并不会停下来。 5.memmove的返回值是目标空间的起始地址 三、memset memset可以在cplusplus网站查询memset - C 参考 (cplusplus.com)
函数原型如下
void * memset ( void * ptr, int value, size_t num );
函数介绍如下 函数返回值和使用案例如下 函数的使用和介绍 memset是用来填充内存的填充内存的值就是函数参数中的value
#includestdio.h
#includestring.hint main()
{char arr[] hello CILMY23;memset(arr, 1, 5);for (int i 0; i 13; i){printf(%c , arr[i]);}return 0;
} 结果如下 总结 1.memset是用来设置内存的将内存中的值以字节为单位设置成想要的内容。 2.memset的使用需要包括头文件string.h 3.memset的返回是原空间的地址 4.memset只能对字节进行操作操作的是一个字节数 四、memcmp memcmp可以在cplusplus网站查询memcpy - C Reference (cplusplus.com)
函数原型如下
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
函数介绍如下 函数返回值和使用案例如下 memcmp的使用 #includestdio.h
#includestring.hint main()
{int arr1[] { 1,2,3,4,5 };int arr2[] { 1,5,6,7,8, };int ret memcmp(arr1, arr2,5);printf(%d , ret);return 0;
} 总结 1.memcmp是比较从ptr1和ptr2指针指向的位置开始向后的num个字节 2.memcmp的使用需要包括头文件string.h 3.memcmp的返回值是ptr1大于ptr2返回大于0的值小于返回小于0的值相等返回0 4.memcmp比较的是字节内容 感谢各位同伴的支持本期内存函数篇就讲解到这啦如果你觉得写的不错的话可以给个一键三连点赞关注收藏若有不足欢迎各位在评论区讨论。