一: 功能
类比strcpy,实现的是字符串的拷贝工作。但是memcpy直接对内存进行操作,可以对任意类型进行拷贝。
二:定义与声明
void*memcpy(void*dest,const void*src,size_t count)
void*dest也就是说可以接受任意类型的数据。
size_t count 该函数是按照字节进行拷贝的。
三:使用
下面对char和int类型进行拷贝使用
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[100] = {};
int arr2[] = { 1,2,3,4,5 };
memcpy(arr1, arr2, 12);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr1[i]);
}
char arr3[100] = {};
char arr4[] = { "hello world" };
printf("%s\n", (char*)memcpy(arr3, arr4, 3));
return 0;
}
四:模拟函数的实现
其实memcpy的功能和strcpy差不多,所以实现memcpy可以类比strcpy,只不过看待的角度要更细致。需要清楚他们在内存中的分布
以int类型的数据举例子:
定义int arr1[5]={1,2,3,4,5};
在内存中存储:01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 00
目标空间:
因此为了将源内存中的数据取出来放置在目标空间中,则需要逐个字节逐个字节进行访问。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void*my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest && src);
char* start = (char*)dest;//将目标中的首地址存储在start中,以便于后续更改了dest时,还能返回首地址
while (count--)
{
*(char*)dest = *(char*)src;//逐个逐个进行访问将源中的数据取出来放在目标空间中
dest = (char*)dest + 1;//由于dest和src是void*类型的数据,因此可以接受任何类型的指针
src = (char*)src + 1;
}
return start;
}
int main()
{
int arr1[100] = {};
int arr2[] = { 1,2,3,4,5 };
my_memcpy(arr1, arr2, 12);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}