1.先看一下memcpy的声明
从str2所指向的内容的n个字节复制到str1所指向的内容中,注意这里是n个字节,后面实现该库函数时我会详细解释.size_t你们可以查一下它的定义,代表着无符号整型.
2.好,来看看我们如何实现它
void* my_memcpy(void* dest,const void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
//有多少个字节执行多少次
while (num--)
{
//一个字节一个字节进行赋值
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
这里你应该要产生一种疑问,为什么我们实现该库函数时,它的参数类型为什么要这样设置,难道就是简单地模仿?其实当你用这个库函数时,你会发现,它不仅可以实现数组之间的拷贝,字符串之间的拷贝,结构体数组的拷贝......你想想实现它要接受多少不同类型的地址(是整型的还是字符型的还是其它),所以我们在参数中用到了void *,因为它可接受任何类型的地址。好,这个问题解决了,又有一个问题来了,怎样去实现拷贝?
我们知道不同的数据类型,它所占的空间大小也不一样,所以(这里我直接说,后面会有具体实现的效果,好好去看一下那几个例子)我们一个字节一个字节地拷贝,化大为小,每块个小的一样,大的也就一样了.
3.例子1
void* my_memcpy(void* dest,const void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
//有多少个字节执行多少次
while (num--)
{
//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[5] = { 0 };
//将数组arr1的内容拷贝到arr2数组中,arr1数组大小为20个字节所以执行我们的函数20次
my_memcpy(arr2, arr1, sizeof(arr1));
//打印数组arr2
for (int i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
}
3.1例子2
void* my_memcpy(void* dest,const void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
//有多少个字节执行多少次
while (num--)
{
//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
int main()
{
char arr1[] = "abcde";
char arr2[10] = "hahahs";
char* ret = (char*)my_memcpy(arr2, arr1, sizeof(arr1) - 1);
//返回了字符串首地址这就是void* ret = dest的作用
printf("%s\n", ret);
}
3.1例子3
#include <assert.h>
struct s
{
int age;
char name[20];
};
void* my_memcpy(void* dest,const void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
//有多少个字节执行多少次
while (num--)
{
//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
int main()
{
struct s arr3[] = { {20,"张三"},{30,"李四"} };
struct s arr4[4] = { 0 };
my_memcpy(arr4, arr3, sizeof(arr3));
for (int i = 0; i < 2; i++)
{
printf("%d %s\n", arr4[i].age, arr4[i].name);
}
}
4总结
希望各位佬们提提建议,感谢阅读,点个赞吧.