1. memcpy使用和模拟实现

1.1
函数原型
void * memcpy ( void * destination, const void * source, size_t num )
1.2
参数
destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针
source:指向要复制的数据源指针,类型转换为const void*类型的指针
sum:需要复制的字节,size_t是无符号整数类型
1.3
返回值
返回目标数组
1.4
实例
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
1.5
实例运行结果

1.6
模拟实现
#include <stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* sour, size_t sum)
{
//void* ret = dest;
assert(dest && sour);
void* ret = dest;
while (sum--)
{
*(char*)dest = *(char*)sour;
dest = (char*)dest + 1;
sour = (char*)sour + 1;
}
return (ret);
}
main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 20);
int i = 0;
printf("arr2:");
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
1.7
模拟实现运行结果

2. memmove使用和模拟实现

2.1
函数原型
void * memmove ( void * destination, const void * source, size_t num )
2.2
参数
destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针
source:指向要复制的数据源指针,类型转换为const void*类型的指针
sum:需要复制的字节,size_t是无符号整数类型
2.3
返回值
返回目标数组
2.4
实例
#include <stdio.h>
#include <string.h>
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.5
实例运行结果

2.6
模拟实现
#include <stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* sour, size_t num)
{
assert(dest && sour);
void* ret = dest;
if (dest <= sour||(char*)dest>=((char*)sour+num))
{
while (num--)
{
*(char*)dest = *(char*)sour;
dest = (char*)dest + 1;
sour = (char*)sour + 1;
}
}
else
{
dest = (char*)dest + num - 1;
sour = (char*)sour + num - 1;
while (num--)
{
*(char*)dest = *(char*)sour;
dest = (char*)dest - 1;
sour = (char*)sour - 1;
}
}
return (ret);
}
main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 20);
int i = 0;
printf("arr:");
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
2.7
模拟实现运行结果

3. memset函数的使用
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
3.1
函数原型
void * memset ( void * ptr, int value, size_t num )
3.2
参数
ptr:指向要填充的内存块的指针
value:要设置的值,该值作为int传递,但是函数使用该值时需要无符号字符转换填充内存块
num:要设置的字节数
3.3
返回值
返回ptr
3.4
实例
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "hello world";
memset(str, 'x', 6);
printf(str);
return 0;
}
3.5
实例运行结果

4. memcmp函数的使用
memcmp函数⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
4.1 函数原型
int memcmp ( const void * ptr1, const void * ptr2, size_t num )
4.2
参数
ptr1:指向内存块的指针
ptr2:指向内存块的指针
num:要比较的字节
4.3
返回值
ptr1<pyr2,返回<0的数
ptr1>pyr2,返回>0的数
ptr1=pyr2,返回=0的数
4.4
实例
#include <stdio.h>
#include <string.h>
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n = memcmp(buffer1, buffer2, sizeof(buffer1));
if (n > 0)
printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
else if (n < 0)
printf("'%s' is less than '%s'.\n", buffer1, buffer2);
else
printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
return 0;
}
4.5
实例运行结果
