内存函数memcpy//memmove//memcmp//memset

memcpy

/*
    memcpy 内存拷贝  负责两份独立空间数据的拷贝
    void * memcpy ( void * destination, const void * source, size_t num )
    函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
    这个函数在遇到'\0' 的时候并不会停下来。
    如果source和destination有任何的重叠,复制的结果都是未定义的
*/

#include
void* my_memcpy(void* desert, const void* source, int num)
{
    assert(desert&&source);
    int i = 1;
    for (i = 0; i < num; i++)
    {
        *(((char*)desert) + i) = *(((char*)source) + i);
    }
    return desert;
}
int main()
{
    int arr1[] = { 1,2,3,4,5,6,7,8,9 };
    int arr2[9] = { 0 };
    my_memcpy(arr2,arr1,36);

    float arr3[] = { 1.0,2.0,3.0,4.0,5.0 };
    float arr4[5] = { 0 };
    memcpy(arr4,arr3,20);
    return 0;
}

memmove

/*
    memmove负责重叠内存的拷贝
    void * memmove ( void * destination, const void * source, size_t num );
    和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
    如果源空间和目标空间出现重叠,就得使用memmove函数处理。
*/
 

#include
#include
void* my_memmove(void* d, const void* s, size_t num)
{
    assert(d && s);
    int i = 0;
    if (s < d)
    {
        for (i = 0; i < num; i++)//倒着换
        {
            //char* a = (char*)d;
            //char*b = (char*)s;
            *(((char*)d) + num - 1 - i) = *(((char*)s) + num - 1 - i);
        }
    }
    else//正着换
    {
        for (i = 0; i < num; i++)
        {
            *(((char*)d) +i) = *(((char*)s) + i);
        }
    }
    return d;
}
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    //            1 2 1 2 3 4 5 8 9 10
    //            
    my_memmove(arr+2,arr,20);
    //my_memmove(arr, arr+5, 20);

    return 0;
}

memcmp

/*
    内存比较,比较两个内存中的数据相不同相同
    int memcmp ( const void * ptr1,
    const void * ptr2,
    size_t num );
    比较从ptr1和ptr2指针开始的num个字节
    当ptr1大于ptr2,返回大于0 的数字,反之返回小于0的数字
    相等时返回0
*/

int main()
{
    int arr1[] = { 1,2,3 };
    int arr2[] = { 1,4,3 };
    int ret = memcmp(arr2, arr1, 4);//注意单位是字节
    printf("%d\n", ret);
    return 0;
}

memset

/*
    内存设置  memset
    void *memset( void *dest, int c, size_t count );
    dest 起始位置
    c 要设置的值
    count 需要设置的个数,count代表字节数byte,从低字节向高字节改

*/
int main()
{
    char ch[] = "hello bit!";
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    memset(ch, 'x', 5);
    printf("%s\n", ch);
    
    for (int i = 0; i < 10; i++)
    {
        memset(arr+i,1,1);//每个int类型第一个字节设置为1
        memset((char*)(arr + i)+1, 0, 3);//剩下的三个字节设置为0
    }
    for (int i = 0; i < 10; i++)
    {
        printf("%d  ", arr[i]);
    }
    return 0;
}

你可能感兴趣的:(C,c语言)