内存操作函数类似于字符串函数,不过它的适用范围更加广阔,从内存层面对字符串,各种类型数组进行复制,迁移,初始化,比较。掌握这些函数对我们C语言还是挺重要的
一、memcpy
1.函数介绍
void * memcpy ( void * destination, const void * source, size_t num );
1.函数memcpy是将source所指向地址往后num个字节的数据复制到destination的内存里。
例如,
2.这个函数在遇到 '\0' 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的,所以在使用的时候应避免重叠。
2.函数示例

将arr2数组从起始位置往后5个字节大小的数据复制到arr1数组里。
3.memcpy模拟实现
#include <stdio.h>
//模拟实现memcpy
void my_memcpy(void* dest, void* src, size_t num)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src+1;
}
*(char*)dest = '\0';
}
int main()
{
char arr1[20];
char arr2[10] = "你是大帅哥";//一个汉字占两个字节大小
my_memcpy(arr1, arr2, 10);
printf("%s", arr1);
return 0;
}
二、memmove
1.函数介绍
void * memmove ( void * destination, const void * source, size_t num );
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。
2.函数示例
将arr2的 12345 覆盖到arr2 34567 的位置。
3.memmove模拟实现
#include <stdio.h>
#include <assert.h>
//memmove模拟实现
void my_memmove(void* dest, void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
if (dest < src)//1 前->后
{
while(num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else //2 3 后->前
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9 };
int ret = sizeof(arr) / sizeof(arr[0]);
my_memmove(arr + 3, arr, 20);
for (int i = 0; i <ret ; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
三、memcmp
1.函数介绍
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
将 ptr1 所指向的内存块的num个数字字节与 ptr2 所指向的num个数字字节进行比较,如果它们全部匹配,则返回零。如果它们不匹配,返回一个不同于零的值(返回值大于0,则表示在俩个字节不匹配处ptr1的值大于ptr2,反之则返回值小于0)
2.函数示例

arr1中“g”对应arr2的‘\0’,g的ASCII码值大于‘\0’,所以返回了1(大于零的数)
3.memcmp函数模拟
int my_memcmp(void* ptr1, void* ptr2, size_t num)
{
while (num--)
{
if (*(char*)ptr1 == *((char*)ptr2))
{
ptr1 = (char*)ptr1 + 1;
ptr2 = (char*)ptr2 + 1;
}
else
return (*(char*)ptr1 - *((char*)ptr2));
}
return 0;
}
int main()
{
char arr1[10] = "abcdef";
char arr2[10] = "abcdefg";
int ret = my_memcmp(arr1, arr2, 8);
printf("%d", ret);
return 0;
}
总结
内存操作函数相比字符串函数作用范围更广,对与我们写代码时可以通过这些函数找到更加巧妙简练的代码,除了以上三种还有memset,memchr,大家有兴趣也可以学习下。
欢迎大佬指正 ^=^


3198

被折叠的 条评论
为什么被折叠?



