公司建网站多,古镇小企业网站建设,网站个人简介怎么做,seo流量是什么文章目录 前言一、memcpy函数#xff08;内存拷贝函数#xff09;二、memmove重叠拷贝函数三.memset内存设置函数四.memcmp内存比较函数总结 前言
我们之前按学习了C语言标准库中提供了一系列的字符和字符串库函数#xff0c;接下来我们就学习一下关于内存相关的一些函数。… 文章目录 前言一、memcpy函数内存拷贝函数二、memmove重叠拷贝函数三.memset内存设置函数四.memcmp内存比较函数总结 前言
我们之前按学习了C语言标准库中提供了一系列的字符和字符串库函数接下来我们就学习一下关于内存相关的一些函数。 一.memcpy函数内存拷贝函数 void * memcpy ( void * destination, const void * source, size_t num ); 1.1使用
destination这个是目地source这个是源头size_t num这个是内存大小的字节单位
int main()
{int arr1[] { 1,2,3,4,5 };int arr2[] { 0 };memcpy(arr2, arr1, 20);return 0;
} 负责拷贝两块独立空间中的数据 如果你想要重叠拷贝的话则请使用memmove
1.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;}代码写完很多人会有疑问为什么要这样子去做char为什么要这样子的指针去强制类型转换是因为这个代码它可以用于任意类型的内存数据所以说他其实并不知道你传进来的数据是哪种类型的我们之前的例子是一个整形你不能用一个整形去做他万一是长整形短整型怎么办呢所以我们要想到一个能解决所有类型的方法那就是把它强制转换成字符新的指针因为一个字符类型他就等于一个字节所以说你每1就等于一个字节每不管哪个类型都可以把它变成一个字节一个字节的走。 把这个数据类型都可以分成这样所以就解决了。
二.memmove重叠拷贝函数 void * memmove ( void * destination, const void * source, size_t num ); 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠就得使用memmove函数处理。
2.1使用
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 2, arr1, 20);int i 0;for (i 0; i 10; i){printf(%d , arr1[i]);}return 0;
}
2.2模拟实现
这个的模拟实现就比较难了有时候需要从前往后处理有时候又需要从后往前处理所以我们必须来画一个图来思考 当dest的地址小于src的地址我们是从前往后拷还是从后往前拷呢我们可以从图像得出如果我们从后往前拷的话就会覆盖还未考虑的数据所以只能从前往后拷。 同理当dest的地址大于src的时候只能从后往前拷 void* my_memmove(void* dest, const void* src, size_t num)
{//assert(dest src);//从前向后拷贝void* ret dest;if (dest src){while (num--){*(char*)src *(char*)dest;dest *(char*)dest 1;src*(char*)src 1;}}//从后向前拷贝else{while (num--){//先找到最后一个数据通过num--不断向前拷贝*((char*)destnum) *((char*)srcnum);}}return ret;}
三.memset内存设置函数 void * memset ( void * ptr, int value, size_t num ); memset是用来设置内存的将内存中的值以字节为单位设置成想要的内容
使用
int main()
{char str[] hello world;memset(str, x, 6);printf(str);return 0;
}四.memcmp内存比较函数 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 是按字节数去比较如果在之前就比完了后面就不需要再比了如果源头大于目的返回一个小于0的数 int main()
{int arr1[] { 1,2,3,4 };int arr2[] { 1,2,3,5 };int ret memcmp(arr1, arr2, 15);printf(%d, ret);return 0;
}
返回-1 总结
熟练的掌握这一系列的库函数可以在做某些题目上省去大量的时间如果你不做题目掌握这些函数也可以增加你阅读别人函数的经验看得懂别人的代码