(c语言进阶)内存函数

一.memcpy(void* dest,void* src,int num) ,操作单位为字节,完成复制且粘贴字符串

1.应用

cpp 复制代码
#include <stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	memcpy(arr2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

2.模拟实现

cpp 复制代码
#include <stdio.h>
#include<string.h>
#include<assert.h>
//因为该函数需要能操控任意类型的数据,故不能将参数设定为固定类型
//而void类型可以接收任意类型的值
void* my_memcpy(void* arr2,const void* arr1,int x)//将arr1中的元素拷贝给arr2
{
	assert(arr1&&arr2);	//不能为空指针
	void* ret = arr2;  //保存被赋值数组的首地址
	while (x--)
	{
		*(char*)arr2 = *(char*)arr1;	//void*类型无法解引用,需要转换为其他类型
		arr1 = (char*)arr1 + 1;			//转化为char*类型,可每次只改变一个字节,可适用于任何类型
		arr2 = (char*)arr2 + 1;
	}
	return ret;  //返回被赋值数组的首地址
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

3.重点------memcpy()可以处理,但不用来处理重叠内存之间的数据拷贝(这种问题统一交给memmove函数------分工明确)

cpp 复制代码
#include <stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	memcpy(arr1+2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

二.memmove(void* dest,void* src,int num) ------解决重叠内存之间的数据拷贝

1.应用

cpp 复制代码
#include <stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	memmove(arr1 + 2, arr1, 20);//从arr1中读取20个字节,将其复制给arr2
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

2.模拟实现

cpp 复制代码
#include <stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* arr2 ,void* arr1, int x)//将arr1中的元素拷贝给arr2
{
	void* p = arr2;
	assert(arr2&&arr1);
	if (arr2 <= arr1)
	{
		while (x--)
		{
			*(char*)arr2 =*(char*)arr1;
			arr1=(char*)arr1+1;
			arr2=(char*)arr2+1;
		}
	}
	else
	{
		while (x--)
		{
			*((char*)arr2 + x) = *((char*)arr1+x);	//将指针指向需要赋值的空间最后-1,每次向前读取一个字节
		}
	}
	return p;  //返回被拷贝的数组首地址
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	my_memmove(arr1 + 2, arr1, 28);//从arr1中读取20个字节,将其复制给arr1+2
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

三.memcmp()------内存比较函数,比较单位为字节,可以比较任意类型的元素

1.应用

cpp 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5};  //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
	int arr2[20] = { 1,3,2 };	//01 00 00 00 03 00 00 00 02 00 00 00
	int ret = memcmp(arr1,arr2,12);//比较两个数组中前12个字节
	//arr1>arr2返回值为正整数,arr1=arr2返回值为0,arr1<arr2返回值为负整数
	printf("%d",ret);
	return 0;
}

2.模拟实现

cpp 复制代码
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_memcmp(void* arr1, void* arr2, int x)
{
	assert(arr1 && arr2);
	while (*(char*)arr1 == *(char*)arr2) //相同的情况下,判断下一位是否也相同,不相同则退出循环
	{
		if (x==0)  //若有其中一个字符串到达末尾,则退出循环
		{
			break;
		}
		arr1=(char*)arr1+1;
		arr2=(char*)arr2+1;
		x--;
	}
	return *(char*)arr1 - *(char*)arr2;  //不相同则相减返回差值
}
int main()
{
	int arr1[] = { 1,2,3,4,5};  //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
	int arr2[20] = { 1,3,3 };	//01 00 00 00 03 00 00 00 02 00 00 00
	int ret = my_memcmp(arr1,arr2,12);//比较两个数组中前12个字节
	//arr1>arr2返回值为正整数,arr1=arr2返回值为0,arr1<arr2返回值为负整数
	printf("%d",ret);
	return 0;
}

四.memset()------内存初始化(初始化变量为整形或字符型)

1.应用

cpp 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "hello bit";
	memset(arr,'x',5);  //将arr地址后五个字节的内存初始化为'x'
	printf("%s",arr);
	return 0;
}

2.模拟实现

cpp 复制代码
#include<stdio.h>
#include<string.h>
void* my_memset(void* arr, int value, int x)
{
	void* p = arr;
	while (x--)
	{
		*(char*)arr = value;
		arr=(char*)arr + 1;
	}
	return p;
}
int main()
{
	char arr[] = "hello bit";
	my_memset(arr+6,'1',3);
	printf("%s",arr);
	return 0;
}
相关推荐
陈年老古董1 小时前
OpenCV图像处理笔记:图像拼接、答题卡识别与目标提取
人工智能·笔记·python·opencv·计算机视觉
陈年老古董1 小时前
CentOS编译安装Python3.11完整教程
linux·笔记·学习·centos·python3.11
星星.7222 小时前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
sel_92 小时前
【OPD论文导读(二)】OPD(On-Policy Distillation)全景调研:十篇论文讲透“在自己生成的内容上学习“这件事
人工智能·python·深度学习·学习·算法·语言模型
动词ing2 小时前
【学习笔记】数据结构(数组长度和关键特性+快慢指针+左右指针)
数据结构·笔记·学习
老当益壮梁奶奶2 小时前
Linux 软件编程学习笔记(六):线程编程入门与实践
linux·c语言·c++·笔记·学习
摇滚侠2 小时前
《SpringBoot 3:入门与应用实战》第 8 章 AOP 的进阶机制和应用 阅读笔记 16
java·spring boot·笔记
GlueNa2SiO32 小时前
01-Flask入门与环境搭建
笔记·python·学习·flask
GGMM7892 小时前
施耐德 VZ3N1312 浪涌吸收板(整流缓冲板)
笔记·变频器·变频器维修
金幄科技2 小时前
RAG第四篇:重排序 Rerank——粗召回之后,为什么还需要一次精排
人工智能·算法·ai·ai编程