内存操作函数

目录

学习目标:

学会使用内存操作函数memcpy、memmove、memcmp并自主实现

学习内容:

1.1.1 memcpy函数介绍

1.1.2 自主实现memcpy函数

1.2.1 memmove函数

1.2.2 自主实现memmove函数

1.3.1 memcmp函数

1.3.2 自主实现memcmp函


学习目标:

学会使用内存操作函数memcpy、memmove、memcmp并自主实现


学习内容:

!!!!!!!注:建议与主页的字符串函数对比学习!!!!!!!

1.1.1 memcpy函数介绍

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

函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置,返回目的空间的起始地址。注:该函数遇到‘\0’时并不会停下来,如果source和destination有任何的重叠,复制的结果都是未定义的。

它与之前的字符串函数strncpy的区别是字符串函数仅仅能操作字符串,而它能操作任意类型,因为它是在内存层面拷贝的。

1.1.2 自主实现memcpy函数

它的实现原理与函数strncpy类似,但因为它可以操作任意类型所以指针类型为通用型指针void*,注意通用型指针不可以解引用和++、--操作,所以将其强类型转换。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
	void*ret = dest; //记录目的空间的起始位置
	assert(dest&&src);

	while (num--)
	{
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}

1.2.1 memmove函数

void * memmove ( void * destination, const void * source, size_t num );

它的功能与memcpy一样也是从source的位置开始向后复制num个字节的数据到destination的内存位置,返回目的空间的起始位置,但不一样的是它可以操作source和destination重叠的情况。如:1 2 3 4 5 6 7 将里面的1234复制到4 5 6 7的位置上。

1.2.2 自主实现memmove函数

分析:将1234复制到4567中时,如果先将1复制到4中会丢失了4,所以要从后面开始将4复制到7中再到3->6等等。那假如是4567复制到1234时,如果从后面开始的话7->4,那么4会丢失,所以要改为4复制到4中,5->3等等。所以实现时要分成两种情况。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest&&src);
	if (dest < src)   //从前面复制到后面
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			++(char*)dest;
			++(char*)src;
		}
	}
	else
	{
		while (num--)//从后面复制到前面
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

1.3.1 memcmp函数

int memcmp ( const void * ptr1,const void * ptr2,size_t num );

该函数比较从ptr1和ptr2指针开始的num个字节,与strncmp类似,返回值也相同。不同的是它在内存层面操作,可以操作任意类型。

1.3.2 自主实现memcmp函数

实现与strccmp类似。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
int my_memcmp(const void * ptr1, const void * ptr2, size_t num)
{
	assert(ptr1&&ptr2);
	char* dest = (char*)ptr1;
	char* src = (char*)ptr2;
	//比较
	while (num && (*dest == *src))
	{
		dest++;
		src++;
		num--;
	}
	if (!num || ((*dest) && (*src))) //num个字符或者字符都比较完时
	{
		return 0;//完全相等时
	}
	return(*dest - *src);
}

 争取每次学习都能掉十根头发,不掉头发的程序员不是好程序员。

                                                                                                         ——Ace Young

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅人字拖

老板大气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值