内存函数:memcpy()memmove()memcpy()memset()memcmp()

目录

memcpy使用和模拟实现

使用部分:

模拟部分:

memmove使用和模拟实现

使用部分:

模拟部分:

memcpy函数与memmove函数比较

memset函数的使用

memcmp函数的使用


memcpy使用和模拟实现

memcpy() 是C标准库中的一个函数,用于在内存块之间复制一定数量的字节数据。这个函数可以帮助你快速、高效地将数据从一个内存区域复制到另一个内存区域。

memcpy() 函数的原型定义在 <string.h> 头文件中:

void *memcpy(void *dest, const void *src, size_t num);

memcpy() 函数接受三个参数:

1.dest:指向目标内存区域的指针,即数据将被复制到该位置。

2.src:指向源内存区域的指针,即数据将从该位置复制出来。

3.num:要复制的字节数。

使用部分:

memcpy处理非重叠部分,即不自己叠加自己

'\0'照样拷贝过去

模拟部分:

void* my_memcpy(void* dest, const void* src, size_t num)
{
    void* ret = dest;
    assert(dest && src);
    while (num--)
    {
        *((char*)dest) = *((char*)src);
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return ret;
}

memmove使用和模拟实现

memmove()memcpy() 类似,都是C标准库中用于在内存块之间移动数据的函数。不同之处在于,memmove() 能够处理源内存区域和目标内存区域重叠的情况,而 memcpy() 在这种情况下可能会产生未定义的行为。

memmove() 函数的原型定义也在 <string.h> 头文件中:

void *memmove(void *dest, const void *src, size_t num);

memmove() 函数的参数与 memcpy() 函数类似:

1.dest:指向目标内存区域的指针,即数据将被移动到该位置。

2.src:指向源内存区域的指针,即数据将从该位置移动出来。

3.num:要移动的字节数。

使用部分:

memmove处理重叠部分,即自己叠加自己

模拟部分:

void my_memmove(void* dest, const void* src, size_t num)
{
    assert(dest && src);
    void* ret = dest;
    if(dest > src) //从后向前
    {
        while (num--)
        {
            *((char*)dest + num) = *((char*)src + num);
        }
    }
    else
    {
        while (num--)
        {
            *((char*)dest) = *((char*)src);
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    return ret;
}

memcpy函数与memmove函数比较

两者都是内存拷贝函数,但memcpy处理的是不同空间的内容,即目标空间与源空间不同。

memmove函数处理的是相同空间下的内容。

如果用memcpy函数处理相同空间的内容,容易改写原空间的内容从而使结果发生错乱。

memset函数的使用

memset() 是C标准库中的一个函数,用于将指定内存区域的一块字节数据设置为特定的值。这个函数通常用于初始化内存块,填充内存块或者将内存块清零。

memset() 函数的原型定义在 <string.h> 头文件中:

void *memset(void *s, int c, size_t n);

memset() 函数接受三个参数:

1.s:指向要设置数值的内存区域的指针。

2.c:要设置的值,通常是一个无符号字符。

3.n:要设置的字节数。

memcmp函数的使用

memcmp() 是C标准库中的一个函数,用于比较两个内存区域的内容。该函数会按字节比较两个内存区域的内容,直到发现不同的字节或比较完所有字节为止。

memcmp() 函数的原型定义在 <string.h> 头文件中:

int memcmp(const void *s1, const void *s2, size_t n);

memcmp() 函数接受三个参数:

1.s1:指向第一个内存区域的指针。

2.s2:指向第二个内存区域的指针。

3.n:要比较的字节数。

函数返回值是一个整数,表示比较结果:

1.如果两个内存区域的内容相等,返回0。

2.如果第一个区域小于第二个区域,返回一个负数。

3.如果第一个区域大于第二个区域,返回一个正数。

memcmp函数与strcmp函数类似,但memcmp函数的比较是一个字节一个字节的比较。

当字节大小为17时

可以看到在内存中,当列为4时,arr的07就是一个字节,第17个字节arr1是05, arr2是07

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. atof(): 将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = atof(str); printf("%f", num); ``` 结果为:3.140000 2. atoi(): 将字符串转换为int类型的值。 例如: ```c++ char str[] = "1234"; int num = atoi(str); printf("%d", num); ``` 结果为:1234 3. atol(): 将字符串转换为long类型的值。 例如: ```c++ char str[] = "1234567"; long num = atol(str); printf("%ld", num); ``` 结果为:1234567 4. strtod(): 类似于atof(),将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = strtod(str, NULL); printf("%f", num); ``` 结果为:3.140000 5. strtol(): 将字符串转换为long类型的值,同时支持指定转换的基数(例如10进制、16进制等)和错误检查。 例如: ```c++ char str[] = "0110"; long num = strtol(str, NULL, 2); printf("%ld", num); ``` 结果为:6 6. strtoul(): 类似于strtol(),不过返回的是无符号的long类型。 例如: ```c++ char str[] = "0xA"; unsigned long num = strtoul(str, NULL, 16); printf("%lu", num); ``` 结果为:10 7. memset(): 将一段内存区域设置为指定的值。 例如: ```c++ char str[10]; memset(str, 'a', sizeof(str)); printf("%s", str); ``` 结果为:aaaaaaa 8. memcpy(): 将一段内存区域的内容复制到另一段内存区域。 例如: ```c++ char src[] = "hello"; char dst[10]; memcpy(dst, src, sizeof(src)); printf("%s", dst); ``` 结果为:hello 9. memmove(): 和memcpy()类似,但是保证在有重叠的情况下会正确工作。 例如: ```c++ char str[] = "hello"; memmove(str + 2, str, 3); printf("%s", str); ``` 结果为:hehlo 10. memcmp(): 比较两段内存区域的内容是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "Hello"; int result = memcmp(str1, str2, 5); printf("%d", result); ``` 结果为:32(h和H的ASCII码差值) 11. memchr(): 在一段内存区域中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = (char*)memchr(str, 'l', 5); printf("%s", ptr); ``` 结果为:ll 12. strcpy(): 将一个字符串复制到另一个字符串。 例如: ```c++ char src[] = "hello"; char dst[10]; strcpy(dst, src); printf("%s", dst); ``` 结果为:hello 13. strncpy(): 类似于strcpy(),不过只会复制指定长度的字符。 例如: ```c++ char src[] = "hello"; char dst[10]; strncpy(dst, src, 3); dst[3] = '\0'; printf("%s", dst); ``` 结果为:hel 14. strcat(): 将一个字符串附加到另一个字符串的末尾。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strcat(str1, str2); printf("%s", str1); ``` 结果为:helloworld 15. strncat(): 类似于strcat(),不过只会附加指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strncat(str1, str2, 3); printf("%s", str1); ``` 结果为:helloworld 16. strcmp(): 比较两个字符串是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strcmp(str1, str2); printf("%d", result); ``` 结果为:-15 17. strncmp(): 类似于strcmp(),不过只会比较指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strncmp(str1, str2, 3); printf("%d", result); ``` 结果为:0 18. strchr(): 在一个字符串中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = strchr(str, 'l'); printf("%s", ptr); ``` 结果为:llo 19. strrchr(): 类似于strchr(),不过会从字符串的末尾开始搜索。 例如: ```c++ char str[] = "hello"; char* ptr = strrchr(str, 'l'); printf("%s", ptr); ``` 结果为:lo 20. strstr(): 在一个字符串中搜索指定的子字符串,并返回指向该子字符串的指针。 例如: ```c++ char str[] = "hello world"; char* ptr = strstr(str, "world"); printf("%s", ptr); ``` 结果为:world

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值