做彩票网站犯法不,wordpress极速版,怎么做网站编程,扬州百姓网免费发布信息网目录 前言#xff1a; 一、头文件 二、memmove函数的作用 三、理解memmove函数的定义 1、返回类型 2、参数 四、使用memmove函数 案例1#xff1a; 案例2#xff1a; 五、解决数据拷贝之前被覆盖的方法 六、模拟实现memmove函数 前言#xff1a;
上一篇博客#xff0c;我… 目录 前言 一、头文件 二、memmove函数的作用 三、理解memmove函数的定义 1、返回类型 2、参数 四、使用memmove函数 案例1 案例2 五、解决数据拷贝之前被覆盖的方法 六、模拟实现memmove函数 前言
上一篇博客我们已经对memcpy函数进行了学习也指明了memcpy函数不能支持源位置与目标位置相交的情况的拷贝而在这种情况下我们就要使用memmove函数了。所有今天我们来深入学习memmove函数。希望大家可以认真看完。
一、头文件
memmove函数的头文件是和memcpy函数的头文件相同的都是cstringstring.h同样同样memmove函数也是面向所有数据类型的故也称其为内存函数。
C语言
#include string.h
C
#include cstring
二、memmove函数的作用
将 num个 字节的数据从 source 指向的位置复制到 destination 指向的内存块。复制就像使用中间缓冲区一样进行从而允许目标位置和源位置重叠
三、理解memmove函数的定义
void * memmove ( void * destination, const void * source, size_t num );
1、返回类型
在C语言标准库函数的定义中memmove函数的返回类型为一个void*的指针用于返回目标位置的地址由于void*指针的数据类型不固定性可用于返回所有类型的数据。
2、参数
在C语言标准库函数的定义中memmove函数的参数有三个第一个为void*destination不固定类型的指针用于接收目标位置的地址第二个为const void*source不固定类型的指针前用const修饰使程序不可通过该指针更改其指向的数据用于接收源头位置的地址第三个为size_t num用于表示要拷贝的数据的大小单位是字节。
四、使用memmove函数 案例1 #include string.h
int main()
{int arr1[10] { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1, arr1 2, 20);return 0;
}
函数代码运行前的监视结果 函数代码运行后的监视结果 案例2 #include string.h
int main()
{int arr1[10] { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 2, arr1, 20);return 0;
} 函数代码执行前的监视结果 函数代码执行后的监视结果
* 这里强调一下在案例2中若使用memcpy函数其执行结果将为 为什么会出现这种情况
因为从memcpy函数的实现代码可知在memcpy函数中数组的元素3、4、5已经在对其进行拷贝之前便已经被1、2覆盖掉了。 这便是memcpy函数定义的局限性。
五、解决数据拷贝之前被覆盖的方法 对会被覆盖的数据先进行拷贝对不会被覆盖的数据后进行拷贝。而要完成这点必须区分源头位置与目标位置的第一个元素的大小。 六、模拟实现memmove函数
#include assert.hvoid* my_memmove(void* dest, const void* src, size_t num)
{void* ret dest;assert(dest src);if (dest src){//从前往后while (num--){*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;//*((char*)dest) *((char*)src);}}else{//从后往前while(num--){*((char*)dest num) *((char*)src num);}}return ret;
}解释
当源位置地址大于目标位置地址从前往后拷贝否则从后往前拷贝。要是不太理解可以试着用画图来表示数据的拷贝过程 每日一学今天你又超过了百分之九十九的人。
如果本篇文章对你有帮助请点个关注和赞吧
如果对本篇文章有疑惑欢迎在评论区讨论。 注“每天学习一个字符串类函数”类型文章已整理为专栏欢迎大家订阅。