网站开发有哪些服务器,个人网站可以做淘宝客,斗鱼企业网站建设的目的,12306网站如何做解绑文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作… 文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作海 创作不易宝子们如果这篇文章对你们有帮助的话别忘了给个免费的赞哟~ 一、memcpy函数的使用和模拟实现
函数原型
void * memcpy ( void * destination, const void * source, size_t num );内存复制块
将num字节的值从源指向的位置直接复制到目标指向的内存块。源指针和目标指针所指向的对象的底层类型与此函数无关;结果是数据的二进制副本。该函数不检查源中是否有任何终止null字符——它总是精确地复制num个字节。为了避免溢出目标参数和源参数所指向的数组的大小应该至少为num字节并且不应该重叠(对于重叠的内存块memmove是一种更安全的方法)。
1.1 memcpy函数的使用
【示例】将arr1中的前5个元素拷贝到arr2中
#includestdio.h
#includestring.hint main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] { 0 };memcpy(arr2, arr1, 20);for (int i 0; i 20; i){printf(%d , arr2[i]);}return 0;
}1.2 memcpy函数的模拟实现
模拟思路 函数参数和返回类型mencpy不仅可以将拷贝整形数据其他的数据类型也可以拷贝即参数类型根据传入的数据类型决定需要接受任意类型的地址所以参数类型可以定义成void*因为src是原数据我们不期望它被修改所以要加const进行修饰还需要指定拷贝num字节的值即num要为非负数为了避免传入进来的num是一个负数可以将num定为size_t类型memcpy返回的是目标空间的起始地址即返回类型我们也定为void* 。 函数体首先用assert断言判断传入进来的是否为空指针void* 类型的指针不可以直接解引用这里的num是指字节数不同的数据类型所占的字节数不同所以最好一个一个字节访问即将 void* 强转成 char* (解引用时一次访问一个字节)类型每访问一个字节后就自增一拷贝完成后这时的dest已经不再指向首元素地址所以在这之前要创建一个void* 的指针记录dest最后返回记录dest的指针即可。 模拟代码
#includestdio.h
#includeassert.hvoid* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest src);void* ret dest;while (num--){*(char*)dest *(char*)src;src (char*)src 1;dest (char*)dest 1;}return ret;
}int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] { 0 };my_memcpy(arr2, arr1, 20);for (int i 0; i 20; i){printf(%d , arr2[i]);}return 0;
}注意memcpy函数不可以拷贝重叠的内存块(虽然也能实现)但不安全对于重叠的内存块memmove是一种更安全的方法。
二、memmove函数的使用和模拟实现
函数原型
void * memmove ( void * destination, const void * source, size_t num );移动内存块
将num字节的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样进行从而允许目标和源重叠。源指针和目标指针所指向的对象的底层类型与此函数无关;结果是数据的二进制副本。该函数不检查源中是否有任何终止null字符——它总是精确地复制num个字节。为了避免溢出目的参数和源参数所指向的数组的大小至少为num字节。
memcpy与memmove的区别就在于memmove可以复制重叠的内存块。
2.1 memmove函数的使用
【示例】将arr1中的12345这几个元素拷贝到arr1中的34567的位置。
#includestdio.h
#includestring.h
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 2, arr1, 5 * sizeof(int));for (int i 0; i 10; i){printf(%d , arr1[i]);}return 0;
}2.2 memmove函数的模拟实现 模拟思路 函数参数和返回类型和memcpy函数一致这里就不多作介绍了。 函数体这里总体要分两种情况一种是destsrc另一种就是destsrc对于第一种情况需要从前向后拷贝对于第二种情况需要从后向前拷贝至于不重叠的话无论是从前向后还是从后向前都是可以的。从前向后拷贝的方法和memcpy是一致的这里就不多说了从后向前拷贝也比较简单src强转成 char* 之后加上num就是最后一个字节然后num不断自减就可以实现从后向前拷贝。 模拟代码
#includestdio.h
#includeassert.h
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;src (char*)src 1;dest (char*)dest 1;}}else {// 后--前while (num--){*((char*)dest num) *((char*)src num);}}return ret;
}int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1 2, arr1, 5 * sizeof(int));for (int i 0; i 10; i){printf(%d , arr1[i]);}return 0;
}三、memset函数的使用
函数原型
void * memset ( void * ptr, int value, size_t num );填充内存块 将ptr指向的内存块的前num个字节设置为指定的值(解释为unsigned char)。 参数说明 ptr 指向要填充的内存块的指针。 value 需要设置的值。该值作为int类型传递但函数使用该值的unsigned char转换来填充内存块。 num 要设置为该值的字节数。size_t是一个无符号整型。
3.1 menset函数的使用
【示例】将arr数组中的hello替换成x
#includestdio.h
#includestring.h
int main()
{char arr[] hello world;memset(arr, x, 5);printf(%s\n, arr);return 0;
}注意这里的num指的是该值的字节数。
四、memcmp函数的使用
函数原型
int memcmp ( const void * ptr1, const void * ptr2, size_t num );比较两个内存块 将ptr1所指向的内存块的前num字节与ptr2所指向的前num字节进行比较如果它们都匹配则返回0如果不匹配则返回不同于0的值表示哪个值更大。 参数说明 ptr1 指向内存块的指针。 ptr2 指向内存块的指针。 num 要比较的字节数。 注意与strcmp不同该函数在找到空字符后不会停止比较。
return value(返回值)indicates(含义)0在两个内存块中不匹配的第一个字节在ptr1中的值低于ptr2中的值(如果作为unsigned char值计算)0两个内存块的内容是相等的.0在两个内存块中不匹配的第一个字节在ptr1中的值大于ptr2中的值(如果作为unsigned char值计算)
4.1 memcmp函数的使用
【示例】比较arr1数组和arr2数组中前16个字节在比较前17个字节。
#includestdio.h
#includestring.h
int main()
{int arr1[] { 1,2,3,4,5,6,7 };int arr2[] { 1,2,3,4,8,8,8 };int ret1 memcmp(arr1, arr2, 16);int ret2 memcmp(arr1, arr2, 17);printf(%d\n, ret1);printf(%d\n, ret2);return 0;
}分析一个整型占4个字节比较前16个字节就是比较前4个元素前4个元素都是一样的所以返回0。但从17个字节开始arr1和arr2数组就开始不同了arr1是05而arr2是0808大于05所以返回-1。