1.memcpy

函数原型:

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

功能:

  • memcpy 是完成内存块拷贝的,不关注内存中存放的数据是啥
  • memcpy 从source 的位置开始向后复制num 个字节的数据到 destination 指向的内存位置。
  • 如果source 和 destination 有任何重叠,复制的结果都是未定义的
  • mencpy 的使用需要包含<string.h>

参数:

  • destination:指针,指向目标空间,拷贝的数据存放在这里
  • source:指针,指向源空间,要拷贝的数据从这里来
  • num:要拷贝的数据占据的字节数

返回值:
拷贝完成后,返回目标空间的起始地址

1.代码演示

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 20)int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

打印结果

2.模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
//void*用来接受任意类型的指针
void* memcpy(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	assert(dst);
	assert(src);
	while (count--)
	{
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return (ret);
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

打印结果
在模拟实现过程中,要用void*类型的指针,目的是为了接受任意类型的指针,并且在实现数据拷贝的时候要将指针强制转化为(char * )类型的,再加加,目的是一字节一字节地交换

2.memmove

函数原型:

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

功能:

  • memmove 函数也是完成内存块拷贝的
  • 和memcpy 的差别就是memmove 函数处理的源内存块和目标空间内存块可以重叠的。
  • memmove 的使用需要包含<string.h>

参数:

  • destination:指针,指向目标空间,拷贝的数据存放在这里
  • source :指针,指向源空间,要拷贝的数据从这里来
  • num:要拷贝的数据占据的字节数

返回值:
拷贝完成后,返回目标空间的起始地址

1.代码演示

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

打印结果

2.模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
void* memmove(void* dst, const void* src, size_t count)
{
	assert(dst && src);
	void* str = dst;
	if (src >= dst)
	{
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
	return str;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	//memmove(arr1 + 2, arr1, 20);
	memmove(arr1, arr1 + 3, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

dst = (char)dst - 1; src = (char)src - 1; 要减1的目的是要将指针定位到最后一个数据的最后一个字节。

3.memset

函数原型:

void * memset (void *ptr , int value ,size_t num );

功能:

  • memset 函数是用来设置内存块的内容的,将内容中指定长度的空间设置为特定的内容。

参数:

  • ptr:指针,指向要设置的内存空间,也就是存放了要设置的内存空间的起始地址。
  • value:要设置的值,函数将会把value 值转换为 unsigned char 的数据进行设置的。也就是以字节为单位来设置内存块的。
  • num:要设置的内存长度,单位是字节

返回值: 返回的是要设置的内存空间的起始地址。

1.代码演示

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "hello world";
	memset(str, 'y', 8);
	printf(str);
	return 0;
}

打印结果

2.总结

当有一块内存空间需要设置内容的时候,就可以使用memset 函数,值得注意的是memset 函数对内存单元的设置以字节为单位的。

4.memcmp

函数原型:

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

功能:
比较指定的两块内存块的内容,比较从ptr1 和ptr2 指针指向的位置开始,向后的num 个字节,memcmp的使用需要包含<string.h>
参数:

  • ptr1:指针,指向一块待比较的内存块
  • ptr2:指针,指向另外一块待比较的内存块
  • num:指向的比较长度,单位是字节

返回值:

  • < 0(负数) ptr1 中第一个不相等的字节 < ptr2 中对应字节(按 ASCII / 二进制值比较)
  • = 0(零) 前 num 个字节全部相等
  • > 0(正数) ptr1 中第一个不相等的字节 > ptr2 中对应字节

1.代码演示

#include<stdio.h>
#include<string.h>
int main()
{
	char buffer1[] = "abcdefhijk";
	char buffer2[] = "abcDefHijk";
	int n = memcmp(buffer1, buffer2, sizeof(buffer1));
	printf("%d ", n);
	return 0;
}

打印结果

2.总结

如果比较2块内存单元的数据的大小,可以使用memcpy 函数,这个函数的特点就是可以指定比较长度。
memcmp 函数是通过返回值告知大小关系的。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐