目录
1.memcpy
使用
模拟实现
2.memmove
使用
模拟实现
3.memset
使用
4.memcmp
使用
1.memcpy
使用
void * memcpy ( void * destination, const void * source, size_t num );
目的地址 源地址 字节数
destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。
source:指向要复制的数据源的指针,类型转换为const void*类型的指针。
num:要复制的字节数。size_t是一个无符号整数类型。
1.函数memcpy从源地址(destimation)的位置开始向后复制num个字节的数据到目的地址(source)指向的内存位置
2.这个函数在遇到 '\0' 的时候并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未定义的。
演示:
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
//从arr1->arr2 20个字节
int i = 0;
//这里打印10个方便查看
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
结果:
模拟实现
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest);//判断是否为空
assert(src);
void* ret = dest;//防止返回的地址变动
//逐个传入
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return(ret);
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 20);
//从arr1->arr2 20个字节
int i = 0;
//这里打印10个方便查看
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
结果:
2.memmove
使用
其实跟memcpy差不多
void * memmove ( void * destination, const void * source, size_t num );
目的地址 源地址 字节数
destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。
source:指向要复制的数据源的指针,类型转换为constvoid*类型的指针。
num:要复制的字节数。size t是一个无符号整数类型。
1.将num字节的值从源地址指向的位置复制到目的地址指向的内存块。
2.复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。
3.当源地址看见和目标地址出现重叠,可以使用memmove
演示一下,如何重叠的
将源地址的数据传入源地址内(实现在同一个看见重叠)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//将源地址数据传入(源地址+2) 发生重叠
memmove(arr + 2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
这里传入的20个字节 从(arr+2)开始 后面20个字节进行重叠
模拟实现
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(src);//判断是否为空
void* ret = dest;//防止返回的地址变动
//这里进行判断位置 从哪里开始进行替换
if (dest <= src || (char*)dest >= ((char*)src + count)) {
while (count--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else {
dest = (char*)dest + count - 1;
src = (char*)src + count - 1;
while (count--) {
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return(ret);
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
结果:
3.memset
使用
void * memset ( void * ptr, int value, size_t num );
源地址 要变的内容 字节数
ptr指针,指向要填充的内存块。
value:进行设置。该值以int形式传递,但函数使用该值的无符号字符转换填充内存块。
num:要设置为值的字节数。size_t是一个无符号整数类型。
1.设置内存,将内存中的值以字节为单位设置成想要的内容。
这里就不模拟了(循环替换)
int main()
{
char str[] = "hello qingtian";
memset(str, 'x', 5);
printf(str);
return 0;
}
结果:
4.memcmp
使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
地址1 地址2 字节数
ptr1:内存块的指针。
ptr2:内存块的指针。
num:要比较的字节数。
1.进行比较ptr1和ptr2 从0开始比较num个
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abdd";
int n;
n = memcmp(arr1, arr2, sizeof(arr2));
if (n > 0)
printf("'%s' 大于 '%s'\n", arr1, arr2);
else if (n < 0)
printf("'%s' 小于 '%s'\n", arr1, arr2);
else
printf("'%s' 等于 '%s'\n", arr1, arr2);
return 0;
}