C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。

1.memcpy

函数原型:

void *memcpy( void *dest, const void *src, size_t count );
  • void *dest 目标数据首元素地址
  • const void *src 源数据(需要拷贝过去的数据)
  • size_t count 需要拷贝数据的字节大小
  • void *memcpy 拷贝结束后,返回目标数据的起始地址

函数作用: 拷贝 count 个字节的数据从源数据起始地址到目标空间。

函数的使用

#include 
#include 

int main() {

	int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
	int nums2[10] = { 0 };
	memcpy(nums2 , nums1 , 20);
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d " , nums2[i]);
	}

	return 0;
}

C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。_第1张图片

函数的模拟实现:

#include 

void* _memcpy(
	void * dest, 
	const void * src, 
	size_t count
) {
	assert(dest != NULL && src != NULL);

	void* temp = dest;

	while (count) {
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;

		count--;
	}

	return temp;
}

注:
1.memcpystrcpy 的区别是 memcpy 可以拷贝任意类型的数据,但是 strcpy只可以对字符串使用。
2.memcpy 不可以拷贝同一块内存空间的数据。


2.memmove

函数原型:

void *memmove( void *dest, const void *src, size_t count );
  • void *dest 目标数据首元素地址
  • const void *src 源数据(需要拷贝过去的数据)
  • size_t count 需要拷贝数据的字节大小
  • void *memmove 拷贝结束后,返回目标数据的起始地址

函数作用: 拷贝 count 个字节的数据从源数据起始地址到目标空间。与 memcpy不同的是,memmove可以拷贝同一块内存空间的数据。

函数的使用

#include 
#include 

int main() {

	int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
	memmove(nums1 + 2, nums1, 20); // 1 2 1 2 3 4 5 8 9 10
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d ", nums1[i]);
	}

	return 0;
}

C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。_第2张图片

函数的模拟实现:

#include 

void* _memmove(
	void* dest,
	const void* src,
	size_t count
) {
	assert(dest != NULL && src != NULL);

	void* temp = dest;

	if (src < dest) {
		// 从后向前拷贝
		while (count) {
			*((char*)dest + count - 1) = *((char*)src + count - 1);

			count--;
		}
	}
	else {
		// 从前向后拷贝
		while (count) {
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;

			count--;
		}
	}

	return temp;
}

memmove 在实现的过程中,要分两种情况。

  1. src 小于 dest 时,我们需要从后向前拷贝数据,防止数据的覆盖。
  2. src 大于 dest 时,我们需要从前向后拷贝数据,防止数据的覆盖。

3.memcmp

函数原型:

int memcmp( const void *buf1, const void *buf2, size_t count );
  • const void *buf1 数据1首元素地址
  • const void *buf2 数据2首元素地址
  • size_t count 需比较数据的多少个字节
  • int memcmp 返回一个整型
    • > 0 说明第一个数据大于第二个数据
    • < 0 说明第一个数据小于第二个数据
    • = 0 说明两个数据相等

函数作用: 比较 count 个字节两个数据域中的数据是否相等。

函数的使用

#include 
#include 

int main() {
	int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
	int nums2[10] = { 1 , 2 , 3 , 4 , 5 };
	printf("%d" , memcmp(nums1 , nums2 , 20)); // 0

	return 0;
}

C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。_第3张图片


4.memset

函数原型:

void *memset( void *dest, int c, size_t count );
  • void *dest 被填充数据的首元素地址
  • int c 填充的数据
  • size_t count 填充的多少字节的数据
  • void *memset 返回填充后数据的首元素地址

函数作用: 内存空间填充数据。

函数的使用

#include 
#include 

int main() {
	int nums[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
	int * res = (int*)memset(nums , 0 , 20);
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d " , *(res + i));
	}

	return 0;
}

C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。_第4张图片
注: memset会把数据的每一个字节都填充成你要填充的那个元素。

你可能感兴趣的:(c语言,学习,内存函数,库函数)