做外贸上什么网站,申请注册公司需要多少钱,设一个网站链接为安全怎么做,做图片格式跟尺度用哪个网站好目录 1、memcpy函数
memcpy函数的模拟实现
2、memmove函数
memmove函数的模拟实现
3、memset函数
4、memcmp函数 1、memcpy函数
描述#xff1a; C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。 声明…目录 1、memcpy函数
memcpy函数的模拟实现
2、memmove函数
memmove函数的模拟实现
3、memset函数
4、memcmp函数 1、memcpy函数
描述 C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。 声明 void *memcpy(void *str1, const void *str2, size_t n)参数 str1 -- 指向用于存储复制内容的目标数组类型强制转换为 void* 指针。str2 -- 指向要复制的数据源类型强制转换为 void* 指针。n -- 要被复制的字节数。 返回值 该函数返回一个指向目标存储区 str1 的指针。 用法
#include stdio.h
#include string.h
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] { 0 };memcpy(arr2, arr1, 20);//20 字节数int i 0;for (i 0; i 20; i){printf(%d , arr2[i]);}
结果 memcpy函数的模拟实现
#include stdio.h
#include string.h
#include assert.hvoid* my_memcpy(void* str1, void* str2, size_t n)
{void* ret str1;assert(str1 ! NULL);assert(str2 ! NULL);while (n--){*(char*)str1 *(char*)str2;//将str2的字符赋给str1str1 (char*)str1 1;//跳到下一个字节str2 (char*)str2 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);//20 字节数int i 0;for (i 0; i 20; i){printf(%d , arr2[i]);}return 0;
}
这里不能写成str1因为str1是void*指针。也不能写成char*str1因为强转是临时的但是可以这样写char*str1。
结果 2、memmove函数
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果原空间和目标空间出现重叠就得使用memmove函数处理。
描述 C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1但是在重叠内存块这方面memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中复制后源区域的内容会被更改。如果目标区域与源区域没有重叠则和 memcpy() 函数功能相同。 声明 void *memmove(void *str1, const void *str2, size_t n)参数 str1 -- 指向用于存储复制内容的目标数组类型强制转换为 void* 指针。str2 -- 指向要复制的数据源类型强制转换为 void* 指针。n -- 要被复制的字节数。 返回值 该函数返回一个指向目标存储区 str1 的指针。 用法
#include stdio.h
#include string.hint main()
{const char dest[] oldstring;const char src[] newstring;printf(Before memmove dest %s, src %s\n, dest, dest);memmove(dest, src, 9);printf(After memmove dest %s, src %s\n, dest, dest);return(0);
}
结果 memmove函数的模拟实现 数组的地址是从低到高的
#include stdio.h
#include assert.h
void* my_memmove(void* str1, const void* str2, size_t n)
{assert(str1 ! NULL);assert(str2 ! NULL);void* ret str1;if (str1 str2){//从前向后while (n--){*(char*)str1 *(char*)str2;str1 (char*)str1 1;str2 (char*)str2 1;}}else{//从后向前while (n--){*((char*)str1 n) *((char*)str2 n);}}return ret;
}int main()
{int arr[] { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr 2, arr, 5 * sizeof(int));int i 0;for (i 0; i 10; i){printf(%d , arr[i]);}return 0;
}
3、memset函数
描述 C 库函数 void *memset(void *str, int c, size_t n) 用于将一段内存区域设置为指定的值。 memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中这可以用于将内存块清零或设置为特定值。 在一些情况下需要快速初始化大块内存为零或者特定值memset() 可以提供高效的实现。 在清空内存区域或者为内存区域赋值时memset() 是一个常用的工具函数。 声明; void *memset(void *str, int c, size_t n)参数: str -- 指向要填充的内存区域的指针。c -- 要设置的值通常是一个无符号字符。n -- 要被设置为该值的字符数。 返回值 该值返回一个指向存储区 str 的指针。 用法
#include stdio.h
#include string.hint main ()
{char str[50];strcpy(str,This is string.h library function);puts(str);memset(str,$,7);puts(str);return(0);
}
结果 4、memcmp函数
描述 C 库函数 int memcmp(const void *str1, const void *str2, size_t n)) 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。 声明 int memcmp(const void *str1, const void *str2, size_t n)参数 str1 -- 指向内存块的指针。str2 -- 指向内存块的指针。n -- 要被比较的字节数。 返回值 如果返回值 0则表示 str1 小于 str2。如果返回值 0则表示 str1 大于 str2。如果返回值 0则表示 str1 等于 str2。 用法
#include stdio.h
#include string.hint main ()
{char str1[15];char str2[15];int ret;memcpy(str1, abcdef, 6);memcpy(str2, ABCDEF, 6);ret memcmp(str1, str2, 5);if(ret 0){printf(str2 小于 str1);}else if(ret 0) {printf(str1 小于 str2);}else {printf(str1 等于 str2);}return(0);
}
结果
str2 小于 str1