目录
1、memcpy函数
描述:
C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
声明:
cppvoid *memcpy(void *str1, const void *str2, size_t n)
参数:
- str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
- n -- 要被复制的字节数。
返回值:
该函数返回一个指向目标存储区 str1 的指针。
用法:
cpp
#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函数的模拟实现
cpp
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* 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的字符赋给str1
str1 = (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() 函数功能相同。
声明:
cppvoid *memmove(void *str1, const void *str2, size_t n)
参数:
- str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
- n -- 要被复制的字节数。
返回值:
该函数返回一个指向目标存储区 str1 的指针。
用法:
cpp
#include <stdio.h>
#include <string.h>
int 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函数的模拟实现
数组的地址是从低到高的
cpp
#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() 是一个常用的工具函数。
声明;
cppvoid *memset(void *str, int c, size_t n)
参数:
- str -- 指向要填充的内存区域的指针。
- c -- 要设置的值,通常是一个无符号字符。
- n -- 要被设置为该值的字符数。
返回值:
该值返回一个指向存储区 str 的指针。
用法:
cpp
#include <stdio.h>
#include <string.h>
int 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 个字节进行比较。
声明:
cppint memcmp(const void *str1, const void *str2, size_t n)
参数:
- str1 -- 指向内存块的指针。
- str2 -- 指向内存块的指针。
- n -- 要被比较的字节数。
返回值:
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str1 大于 str2。
- 如果返回值 = 0,则表示 str1 等于 str2。
用法:
cpp
#include <stdio.h>
#include <string.h>
int 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