内存函数基本介绍【C语言】


前言

本文主要介绍memcpy函数、memmove函数、memcmp函数,以及memcpy函数与memmove函数的模拟实现。

一、memcpy函数

1.memcpy函数基本介绍

  初学memcpy函数可能会有疑惑,为什么有strcpy函数还需要memcpy函数,实际上strcpy是用来复制字符的,但是,memcpy什么类型的数据都可以复制。
在这里插入图片描述
  memcpy函数的三个参数分别是指向需要复制数据位置的指针,指向待复制数据的指针,以及要复制的字节数。
  使用实例如下:

#include<ctype.h>
#include<string.h>
int main()
{
	int arr[] = {1,2,3,4};
	int arr1[5] = {0};
	memcpy(arr1,arr,16);
	return 0;
}

注意:第三个参数是字节数,所以应该传入要复制的元素个数与元素类型的所占字节数的乘积。

2.memcpy函数的模拟实现

void* my_memcpy(void* dest, const void* src,size_t sz)
{
	assert(dest && src);
	void* ret = dest;
	while(sz--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

  模拟函数也和memcpy函数使用一样的参数,void* 类型和const void* 都可以接收任何类型的指针。传入两个指针后按照需要复制的字节数通过循环完成复制。因为是按字节复制的,所以指针每次只能增加一字节,复制一字节,因此在解引用进行复制时要首先将指针类型转为char* 类型,这样才只会取出一字节的数据,指针加一时也是一样的道理,为了使加一的操作只加一个字节,需要先将指针转为char* 类型。

二、memmove函数

1.memmove函数基本介绍

  memmove函数的参数与memcpy基本类似,不多做介绍。
在这里插入图片描述
  memmove函数与memcpy函数的区别在于memmove函数可用于处理内存重叠的复制情况,而memcpy函数不可,但是这是一种标准,实际上在内存重叠的情况下使用memcpy函数进行复制仍然能够成功运行(前面模拟实现的memcpy函数显然处理不了内存重叠这种情况下的复制)。
  这里稍微介绍一下内存重叠的复制情况。类似于下图这种,将34567复制至12345的位置。
在这里插入图片描述

2.memmove函数的模拟实现

void my_memmove(void* dest, const void* src, size_t sz)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		for(int i=0;i<sz;i++)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (sz--)
		{
			*((char*)dest + sz) = *((char*)src+sz);
		}
	}

	return ret;
}

  这里分为了两种情况,第一种是当内存重叠时进行复制,按字节从前往后复制,第二种是按字节从后往前复制。

三、memset函数

在这里插入图片描述
  memset函数的三个参数分别是指向待操作数据的指针,要给每个字节设置的值以及设置的字节数。即根据传入的指针和字节数对每个字节的值进行设置。

四、memcmp函数

在这里插入图片描述
  基于我个人的理解,memcmp函数与strcmp函数类似,都是传入两个指针,根据指针指向的数据进行比较,不过memcmp会按字节对数据进行比较,并且比较的数据类型不仅仅是字符类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值