文章目录
一,函数介绍
void*是什么意思?有什么作用?,如果不理解的话可以跳转:void*是什么意思?有什么作用?
1.memcpy
函数原型:
void * memcpy ( void * destination, const void * source, size_t num );
memcpy函数是一种对内存进行拷贝的函数拷贝的单位是字节。
参数介绍:
source:模板;
destination:目的地;
num:表示需要拷贝的字节数。(必须是大于等于0的整数)
简单来说就是将source指向的内存块的值拷贝至destination指向的内存块,至于拷贝多大的内存就看num有多大单位字节。
2.memmove
函数原型:
void * memmove ( void * destination, const void * source, size_t num );
参数介绍:
source:模板;
destination:目的地;
num:表示需要拷贝的字节数。(必须是大于等于0的整数)
简单来说就是将source指向的内存块的值拷贝至destination指向的内存块,至于拷贝多大的内存就看num有多大单位字节。
没错memcpy和memmove非常的相你可以近似地把memmove当成memcpy的升级版
memmove和memcpy的区别:
memcpy中如果source和destination有任何的重叠,复制的结果都是未定义的,也就是说memcpy只能对
没有任何重叠的两块内存进行拷贝。
memmove和memcpy的差别就是memmove函数处理的
源内存块和目标内存块是可以重叠的。
但是有些编译器中memcpy也可以对重叠的内存进行拷贝
3.memset
函数原型:
void * memset ( void * ptr, int value, size_t num );
参数介绍:
这个函数其实就是将ptr指向的内存空间的num个字节改成value(注:value是ASCII码)
二,使用c语言进行模拟实现(部分)
1.memcpy
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
void Memcpy(void* arr, const void* a, size_t num)
{
assert(arr != NULL);
assert(a != NULL);
for (int i = 0; i < num; i++)
{
*(char*)arr = *(char*)a;
arr = (char*)arr + 1;
a = (char*)a + 1;
}
}
int main()
{
char arr[10] ="ahah";
char a[] = "ss";
Memcpy(arr, a, 2);
printf("%s", arr);
return 0;
}
2.memmove
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
void* Memmove(void* arr, const void* a, size_t num)
{
assert(arr != NULL);
assert(a != NULL);
void* p = arr;
if (arr > a)
{
while (num--)
{
*((char*)arr + num) = *((char*)a + num);
}
}
else
{
for (int i = 0; i < num; i++)
{
*(char*)arr = *(char*)a;
arr = (char*)arr + 1;
a = (char*)a + 1;
}
}
return p;
}
int main()
{
char arr[10] ="abcdef";
Memmove(arr, arr+2, 3);
printf("%s", arr);
return 0;
}