实现如下
#include <stdio.h>
#include <stdlib.h>
//这里为什么要返回void *, 考虑下连续调用
void * memcpy(void *dst, const void *src, size_t size)
{
const register char *s = static_cast<const char *>(src);
register char *e = static_cast<char *>(dst);
register int i;
//这里为什么要倒着?考虑下位置关系
if(e >=s && e < s + size)
{
for(i = size - 1; i >= 0; i --)
{
e[i] = s[i];
}
}
else
{
for(i = 0; i < size; i ++)
{
e[i] = s[i];
}
}
return e;
}
最基本的第一个问题就是为甚么要返回void *?
原因如下:
int *d = static_cast<int *>(memcpy(memcpy(a - 1, a, sizeof(int) * 2), a, sizeof(int) * 3));
连续调用以及方便访问(顺便提示下,代码可编译过去的,你没看错,就是a - 1)
第二个问题就是上面那一行代码,代码的实现修改了const int *src(就是a)的内容。
建议看不懂的孩纸去看一下
const int val; int const val; const int *pointer; int *const pointer;
这四个的区别和联系。
第三个问题就是拷贝的写法了,仔细分析一下src, dst和src + size三者位置的先后顺序即可得。
建议还是自己实现下,多试试测试,就可以领悟其中的问题。