2021-6-8笔记梳理

本文详细介绍了C++中用于内存操作的两个函数:memcpy和memmove。memcpy用于内存拷贝,而memmove则处理可能存在的内存重叠情况。通过参数解析、用法示例和工作原理的讲解,阐述了两者的不同之处,并强调了在内存重叠时使用memmove的重要性。
摘要由CSDN通过智能技术生成

目录

memcpy——内存拷贝

参数

用法

工作原理

memmove——内存移动(其实和内存拷贝意思一样)

 参数

用法

工作原理

区别

 注意事项


memcpy——内存拷贝

memcpy - C++ Reference (cplusplus.com)

memory——计算机里是内存的意思

copy ——复制

结合起来就是内存拷贝

参数

void* memcpy(char* destination, const char* source, size_t num);

char* destination 目的地,就是要拷贝到哪——给个首地址

char* source        源,从哪拷贝                  ——也是首地址

size_t num           要拷贝的字节数               ——是字节数,不是个数

用法

int main()
{
    int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int arr2[20] = { 0 };
    memcpy(arr2, arr1, 20);//这里要拷贝1,2,3,4,5,共20字节
    return 0;
}
//结果就是arr2[20] = { 1,2,3,4,5 };

工作原理

因为传的两个参数是 void* 的,作为库函数的实现者,他是不知道使用的人到底传什么参数,所以用void* 来接收两个首地址,不知道你要拷贝整形,结构体还是别的,所以就用字节个数作为拷贝长度。那么问题来了,用void* 和字节个数有什么用呢,下面我简单模拟实现一下库函数

​void* my_memcpy(void* destination, const void* source, size_t num)
{
	assert(destination && source); //断言,检查源和目的是不是空指针     
	char* p1 = (char*)destination; //强制类型转换,转换成char*之后,就可以不用管你是什么类型的
	char* p2 = (char*)source;      //变量,都按一个字节算,拷贝的时候一个字节一个字节的拷贝
	while (num--)
	{
		*p1++ = *p2++;             //memcpy是从源首地址的第一个字节拷贝到
                                   //目的地址的首地址的第一个字节开始拷贝到最后一个
	}
	return destination;

memmove——内存移动(其实和内存拷贝意思一样)

memmove - C++ Reference (cplusplus.com)

 参数

和memcpy的一样

用法

和memcpy的一样,那么问题来了,这两个是一样的吗?

不一样

工作原理

void* my_memmove(void* destination, const void* source, size_t num)
{
	assert(destination && source);
	char* p1 = (char*)destination;
	char* p2 = (char*)source;

	while (num--)
	{
		*(p1 + num - 1) = *(p2 + num - 1); //从源地址的最后一个字节开始拷贝,
	}                                      //拷贝到目的地最后一个字节
                                           //从最后一个字节开始拷贝到第一个字节
	return destination;
}

区别

 注意事项

我们知道了memcpy和memmove 的具体实现原理,没有内存重叠的时候都是一样的用法,要是拷贝的内存有重叠的地方就有可能出现问题,那么具体是用memcpy还是memmove,可以画一个我给出的那种图,一目了然

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值