内存相关的函数这篇博客介绍三个——memcpy,memmove,memcmp。
目录
1.复制所有类型——memcpy:
memcpy函数介绍:
所需要的头文件
返回类型:是被复制到目标空间的起始地址。
参数类型:
第一个参数:是被复制到目标空间的起始地址。
第二个参数:所要复制的字符的起始地址。
第三个参数:复制字符的字节数。
使用void*的原因是,它具有包容性,无论是什么类型的数据都可以。
memcpy函数的演示:
#include<stdio.h>
#include<string.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int cpy[] = { 0,0,0,0,0,0 };
//复制从cpy的前3个数到arr中去
memcpy(arr, cpy, 12);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
memcpy函数的模拟实现:
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* des, const void* src, size_t n)
{
//判断指针的有效性
assert(des && src);
//因为要返回起始地址,但是改地址会改变,所以先记录一下
void* ret = des;
while (n--)
{
//void*是空类型,必须得强制转换成其他有意义的类型
//才可以做相关的解引用和加减整数操作
*(char*)des = *(char*)src;
des = (char*)des + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int cpy[] = { 0,0,0,0,0,0 };
my_memcpy(arr, cpy, 12);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
2.移动内部数据——memmove:
memmove函数介绍:
所需头文件:
返回类型:是被复制到目标空间的起始地址。
参数类型:
第一个参数:是被复制到目标空间的起始地址。
第二个参数:所要复制的字符的起始地址(还是在该空间)。
第三个参数:复制字符的字节数。
memmove函数演示:
#include<stdio.h>
#include<string.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr, arr+2, 16);
//把3,4,5,6移到arr的起始位置
//应该是3,4,5,6,6,7,8,9,10
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
memmove函数的模拟实现:
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* des, const void* src, size_t n)
{
//判断指针的合法性
assert(des && src);
//返回des的地址,提前保存
void* ret = des;
//des<src==>从前向后移动
if (des < src)
{
while (n--)
{
//同上
*(char*)des = *(char*)src;
des = (char*)des + 1;
src = (char*)src + 1;
}
}
//从后向前移动
else
{
while (n--)
{
//n进来之后就是15,刚好从最后面开始,随着自减,就都能覆盖完成
*((char*)des + n) = *((char*)src + n);
}
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr, arr + 2, 16);
//把3,4,5,6移到arr的起始位置
//应该是3,4,5,6,5,6,7,8,9,10
my_memmove(arr + 4, arr + 2, 16);
//把3,4,5,6移到arr+4的位置
//应该是1,2,3,4,3,4,5,6,9,10
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
3.比较各种数组——memcmp
memcmp函数介绍:
需要的头文件
可以看出,它与之前的字符串比较函数非常像,只不过它可以比较的数据类型由于是void*,从而使得它有了更多的使用范围。
memcmp函数演示:
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,8,1 };
int ret = memcmp(arr1, arr2, 12);
if (ret > 1)
{
printf("arr1>arr2\n");
}
else if (ret == 0)
{
printf("arr1==arr2\n");
}
else
{
printf("arr1<arr2\n");
}
return 0;
}
memcmp函数的模拟实现:
#include<stdio.h>
int my_memcmp(const void* arr1, const void* arr2, size_t n)
{
while (n--)
{
if (*(char*)arr1 != *(char*)arr2)
{
return (*(char*)arr1 - *(char*)arr2);
}
else
{
arr1 = (char*)arr1 + 1;
arr2 = (char*)arr2 + 1;
}
}
return 0;
}
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 9,0,0,1 };
int ret = my_memcmp(arr1, arr2, 12);
if (ret > 0)
{
printf("arr1>arr2\n");
}
else if (ret == 0)
{
printf("arr1==arr2\n");
}
else
{
printf("arr1<arr2\n");
}
return 0;
}
有什么问题希望评论区指出。