C语言内存函数

目录

​编辑

memcpy函数的使用和模拟实现

memcpy的模拟实现

memmove函数的使用和模拟实现

memmove模拟实现

arr+3大于arr

arr+3小于arr

总结

代码

memmset函数的使用

memcmp函数


memcpy函数的使用和模拟实现

https://legacy.cplusplus.com/reference/cstring/memcpy/

memcpy可以复制整数或浮点数

这个代码是将arr数组里的数值复制的a数组,那个40是字节,

int类型是4个字节那么要交换10个数值,4*10=40

cpp 复制代码
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int a[99] = { 0 };
	memcpy(a, arr, 40);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
}
memcpy的模拟实现

强制类型转换char*一个字节一个字节的交换

memmove函数的使用和模拟实现

https://legacy.cplusplus.com/reference/cstring/memmove/

这个函数也是复制数值,但是可以在同一块空间重叠

我们可以看到下面这个代码,是从arr+3开始,arr复制到arr+3的位置上,复制20个字节,4*5=20

memmove模拟实现

数组的地址是连续存放的,地址由低到高

arr+3大于arr

来看看这一张图,当arr+3比arr大我们可以看到从前往后复制可能会覆盖掉复制过去的数值

arr从后往前复制,不会出现覆盖的情况

arr+3小于arr

这一张图,我们可以看到arr+3比arr小的话使用从后往前复制好像会覆盖掉复制过去的数值

当使用从前往后复制,就不会出现覆盖的情况

总结

我们可以使用arr+3来判断

如果arr+3小于arr使用从前往后复制

如果arr+3大于arr使用从后往前复制

代码

下面这代码用if来判断x<y就是arr+3小于arr使用从前往后复制

从前往后复制和memmcpy的模拟实现一样

arr+3大于arr使用从后往前复制x+sz就可以拿到后面的数值,y+sz也可以

拿到后面的数值然后2个进行交换,循环一次sz-1

cpp 复制代码
//                arr+3     arr    交换的字节
void* mn_memmove(void* x, void* y, size_t sz)
{
	if (x < y)//arr+3小于arr,从前往后复制	
	{
		while (sz--)
		{
			*(char*)x = *(char*)y;
			x = (char*)x + 1;
			y = (char*)y + 1;
		}
	}
	else//arr+3大于arr,从后往前复制
	{
		while (sz--)
		{
			*((char*)x + sz) = *((char*)y + sz);
		}
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	mn_memmove(arr + 3, arr, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
}

memmset函数的使用

https://legacy.cplusplus.com/reference/cstring/memmset/

memset可以将内存中的值以字节为单位设置成想要的内容

我们要就fang改成xxxx,

memmset第一个参数是从那个字节开始改,arr+6,下标就是 f 的下标。

第2个参数是要改的内容

第3个参数是要改多少个字节


memcmp函数

https://legacy.cplusplus.com/reference/cstring/memcmp/

memcmp是比较内存的,可以比较字符串,浮点数,整行

小于就返回小于0的数字

大于就返回大于0的数字

等于就返回0

在比较的时候是这样比的,如果再多比一个那么就会比较到04和07

04小于07返回-1

相关推荐
集智飞行37 分钟前
c++函数传参的几种推荐方式
开发语言·c++
鼾声鼾语1 小时前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
麦麦鸡腿堡1 小时前
Java_类的加载
java·开发语言
我命由我123451 小时前
VSCode - Prettier 配置格式化的单行长度
开发语言·前端·ide·vscode·前端框架·编辑器·学习方法
JIngJaneIL2 小时前
基于java + vue校园快递物流管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js
超级大只老咪2 小时前
数组的正向存储VS反向存储(Java)
java·开发语言·python
柏木乃一2 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 基于JSP的物流信息网的设计与实现为例,包含答辩的问题和答案
java·开发语言
leo__5202 小时前
基于LDA的数据降维:原理与MATLAB实现
开发语言·matlab·信息可视化
asdfg12589632 小时前
JS中的闭包应用
开发语言·前端·javascript