memcpy函数的实现和解析

实现如下

#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三者位置的先后顺序即可得。

建议还是自己实现下,多试试测试,就可以领悟其中的问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值