- 一、memcpy()函数
- 1、memcpy的介绍及使用
- 2、模拟实现memcpy()函数
- 二、memmove()函数
- 1、memmove的介绍及使用
- 2、模拟实现memmove()函数
- 三、总结
这期给大家博主给大家介绍一下C语言都有那些内存函数,干货满满哦,一定要耐心看完。 一、memcpy()函数 1、memcpy的介绍及使用
memcpy()函数是C/C++使用的内存拷贝库函数,既然是库函数,我们先来了解一下它的功能以及参数吧
由以上我们可以知道memcpy()一共有三个参数,返回值是void*
(a)viod* destination —— 拷贝的目标内存地址
(b)const void* source —— 拷贝的原始内存地址
(c)size_t num —— 拷贝的字节数
下面我们来看看它的使用,废话不多说,直接上代码
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10];
//现在我们要将arr1中的前半部分拷贝到arr2中,使用memcpy
memcpy(arr2, arr1, sizeof(arr1) / 2);//拷贝20个字节
printf("拷贝后:\n");
for (int i = 0; i < sizeof(arr1) / (2 * sizeof(int)); i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
运行结果:
//模拟实现memcpy()函数
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* p = dest;
while (num--)
{
*((char*)dest) = *((char*)src);
(char*)dest = (char*)dest + 1;
(char*)src = (char*)src + 1;
}
return p;
}
int main()
{
char str1[] = "hello world!";
char str2[10] = "xxxxxxxxx";
//把hello拷贝到str2中
my_memcpy(str2, str1, 5);
printf("%s\n", str2);
return 0;
}
二、memmove()函数
1、memmove的介绍及使用
下面我们来看看memmove()函数的参数及返回值
注意:
1.咋这一看参数和返回值与memcpy一模一样呢,是的,他们参数一样,有什么区别呢,请耐心看完文章。
2.memmove()函数也是C语言库函数中的拷贝函数,但是它拷贝的是同一个数据中的内容
下面来看看它如何使用,上代码
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//这里我们想把1 2 3 4 5 拷贝到3 4 5 6 7的位置
memmove(arr + 2, arr, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
//模拟实现memmove()函数
void* my_memmove(void* dest, const void* src, size_t num)
{
//断言,防止传入空指针
assert(dest && src);
void* p = dest;//记录起始地址
//目的地址比拷贝原始地址小时,从左往右拷贝
//这样可以保证拷贝时把数据给覆盖掉
if (dest < src)
{
while (num--)
{
*((char*)dest) = *((char*)src);
(char*)dest = (char*)dest + 1;
(char*)src = (char*)src + 1;
}
}
else //反之从右往左拷贝
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return p;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
memcpy()与memmove()的区别
memcpy()与memmove()都是库函数中的拷贝函数
但是memcpy是从另一个数组拷贝另一个
而memmove是在同一个数组中进行 *** 作的
这里注意的是:有些编辑器在实现memcpy的时候把它完美实现了,既能在不同数组中 *** 作,也能在同一个数组中 *** 作,这里小编建议在使用的时候还是把它们区别开来比较好
结语:
每个人的成长和进步都离不开点点滴滴的积累,如果小编的内容对您有所帮助,希望友友们三连加关注哦,你的支持是小编创作的最大动力。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)