字符函数和字符串函数2

内存拷贝---->memcpy

memcpy函数是内存拷贝函数,主要拷贝没有叠加的内存,将内存中的num个字节拷贝到另一快内存中。

void*memcpy(void*dest,constvoid*src,size_tcount);

dest目标内存空间,src源空间,count需要拷贝的字节数。

memcpy和strcpy的区别:memcpy可以拷贝任意类型的数据,strcpy只能拷贝字符串。memcpy遇到'\0不会停下来,strcpy遇到\0会停下来。

memcpy的使用:

int main()
{
    int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };
    int arr2[20] = { 0 };
    memcpy(arr2, arr1 + 2, 16);
    for (int i = 0; i < 20; i++)
    {
        printf("%d ", arr2[i]);
    }
    return 0;
}

上述代码把前16个字节拷贝arr2数组里面去,memcpy的拷贝是一个字节一个字节拷贝的,如果拷贝14个字节,那么结果也是2,3,5,6。因为是小端存放,当拷贝12个字节后也就是3个整形,第4个整形也就是第13,14,15,16字节时,其计算机的存储是06,00,00,00。所以拷贝第13个字节的时候已经把数字6拷贝到数组arr2中去了。

memcpy的模拟实现:

void* my_memcpy(void* dest, const void* src, int count)
{
    void* start = dest;
    assert(dest && src);
    while (count--)
    {
        *(char*)dest = *(char*)src;
        (char*)dest = (char*)dest + 1;//void*的指针不能++和解引用,必须强制类型转换
        (char*)src = (char*)src + 1;//char的指针能保证一个字节一个字节拷贝
    }
    return start;
}
int main()
{
    
    int arr1[30] = { 1,2,3,4,5,6,7,8,9,10 };
    int arr2[20] = { 0 };
    my_memcpy(arr2, arr1 + 2, 16);
    for (int i = 0; i < 20; i++)
    {
        printf("%d ", arr2[i]);
    }
    return 0;
}

内存拷贝---->memmove

memcpy和么move的区别为memcpy拷贝的内存是不能重叠的,memmove拷贝的内存可以重叠。

例:

int main()
{
    int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
    memcpy(arr1, arr1 + 2, 20);
    for (int i = 0; i < 20; i++)
    {
        printf("%d ", arr1[i]);
    }
    return 0;
}

我们发现中间出现了重叠,不是我们想要的结果,对于内存重叠的拷贝要用memmove

memmove的使用:

#include<string.h>
int main()
{
    int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
    memmove(arr1, arr1 + 3, 20);
    for (int i = 0; i < 20; i++)
    {
        printf("%d ", arr1[i]);
    }
    return 0;

memove的模拟实现:

思路:memove的模拟实现要分2种情况,从前拷贝和从后拷贝,没有重叠的从前拷贝和从后拷贝都可以。有重叠部分要看原地址和目标地址谁在前谁在后去做相应的分类讨论。

情况一:从前往后拷贝

当dest<src(目标地址在原地址之前,且有重叠)从前向后拷贝

情况二:从后向前拷贝

当dest>src,从后向前拷贝

模拟实现:

void* my_mve(void* dest,const void* src,int count)
{
    void* start = dest;
    assert(dest && src);
    if (dest < src)
    {
            while (count--)
            {
                *(char*)dest = *(char*)src;
                (char*)dest = (char*)dest + 1;
                (char*)src = (char*)src + 1;
            }
            
    }
    else
    {
        while (count--)
        {
            *((char*)dest + count) = *((char*)src + count);
        }
    }
    return start;
}
int main()
{
    int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    my_mve(arr1, arr1 + 2, 20);
    return 0;
}

内存设置---->memset

以字节为单位来设置内存中的数据

int main()
{
    char arr[] = "helloworld";
    memset(arr, 'x', 4);
    printf("%s", arr);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值