memcpy,memmove,memcmp,memset

memcpy

1.不考虑类型,挪动内存

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
int main(void)
{
	float arr[] = { 2.2, 3.2, 6.3,5.4, 3.1 };
	float p[20] = { 0 };
	memcpy(p, arr, 16);
	return 0;
}

2.浅浅的模拟一下

memcpy,memmove,memcmp,memset_第1张图片

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

memcpy,memmove,memcmp,memset_第2张图片

memmove

好兄弟,请看这样一段代码

int arr[] = {1,2,3,4,5,6,7,8,9};
my_memcpy(arr+2,arr,16);

发现了吧,这活啊,交给cpy不靠谱,为啥嘞,画个图看
memcpy,memmove,memcmp,memset_第3张图片
你用1把3填了,拿什么填5?
memcpy,memmove,memcmp,memset_第4张图片
所以呢,就有memmove闪亮登场,这个函数具体是干啥的呢,看模拟中的代码,分成了两种情况:

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#include 
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;//这是返回值
	while (num--)//循环num个字节
	{
		if (dest <= src)//目标首地址小于源首地址,从前面拷,这个过程和memcpy一样
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
		else//不然啊,咱们就从后面拷
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}
int main(void)
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	my_memmove(arr+4, arr + 2, 16);
	return 0;
}

关于memcpy和memmove的孽缘

c语言规定:memcpy只需要实现不重叠部分的拷贝,而memmove要能实现重叠部分的拷贝,所以在功能方面,memmove要比memcpy强大一点,但是有的编译器可能会对memcpy的功能进行扩充,所以memcpy可能在你的编译器上能实现memmove的功能,但是为了提高代码的可移植性,尽量使用memmove实现重叠部分的拷贝。

memcmp

和strcmp类似,相信聪明的读者一定可以自学成才的。
memcpy,memmove,memcmp,memset_第5张图片

memset

震惊!这个函数叫内存设置,怎么说,他可以将每一个字节设置为你想设置的值。
恐怖如斯!
memcpy,memmove,memcmp,memset_第6张图片
点个赞吧,呜呜呜呜呜呜
memcpy,memmove,memcmp,memset_第7张图片

你可能感兴趣的:(c,算法,c语言)