C语言内存函数

目录 (以下四个内存函数在使用的时候都得包含头文件<string.h>)

1 memcpy函数的使用和模拟实现

1.1 函数原型:

1.2 函数的使用 

1.3 函数的模拟实现

2 memmove函数的使用和模拟实现

2.1 函数原型

2.2 函数的使用

2.3 函数的模拟实现

3 memset函数的使用

3.1 函数原型

3.2 函数的使用

4memcmp函数的使用

4.1 函数原型

4.2 函数的使用


1 memcpy函数的使用和模拟实现

1.1 函数原型:

void* memcpy(void* dest, const void* src, size_t num);

memcpy函数会将从指针src处到向后num字节的地址处之间的所有内存空间上的内容都拷贝到从dest开始的内存空间上。

返回拷贝开始地址dest。

1.2 函数的使用 

(需注意:memcpy函数的第三个参数的单位是字节,不是元素个数)

代码演示:

#include <stdio.h>
#include <string.h>

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 5*sizeof(int));//第三个参数的单位是字节,一个整型就4个字节呢,总共要拷贝五个整型变量,所以需要拷贝5*4个字节
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

需注意:第三个参数的单位是字节,一个整型就4个字节呢,总共要拷贝五个整型变量,所以需要拷贝5*4个字节

1.3 函数的模拟实现

代码演示:

#include <stdio.h>
#include <string.h>

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* sta_dest = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		src = (char*)src + 1;
		dest = (char*)dest + 1;
	}
	return sta_dest;
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, 5 * sizeof(int));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

2 memmove函数的使用和模拟实现

2.1 函数原型

void* memmove(void* dest, const void* src, size_t num);

memmove函数与memcpy函数的参数基本一致,功能也基本相同,只是memmove()函数可以解决源内存区域与目标内存区域重叠的拷贝问题,而memcpy函数不行。

2.2 函数的使用

代码演示:

#include <stdio.h>
#include <string.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr + 2, arr, 5 * sizeof(4));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:

2.3 函数的模拟实现

代码演示:

#include <stdio.h>
#include <string.h>

void* my_memmove(void* dest, const void* src, size_t num)
{
	void* sta_dest = dest;
	if (src > dest)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			src = (char*)src + 1;
			dest = (char*)dest + 1;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return sta_dest;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 5 * sizeof(4));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果如下:

3 memset函数的使用

3.1 函数原型

void* memset(void* prt, int value, size_t);

参数说明:

  • ptr:指向要填充的内存块的指针。
  • value:要设置的值(会被转换为无符号字符),这个值会填充到内存块的每个字节。
  • num:要设置的字节数。

3.2 函数的使用

代码演示: 

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = "HOLLOW LiLeLe!";
	char arr2[] = "15353961336";
	memset(arr1 + 2, '*', 9);
	memset(arr2 + 3, '*', 4);
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

运行结果:

4memcmp函数的使用

4.1 函数原型

int memcmp(const void* p1, const void* p2, size_t num);

参数说明:

  • p1:指向第一个内存块的指针。
  • p2:指向第二个内存块的指针。
  • num:要比较的字节数。

memcmp()函数分别会从p1和p2各自向后取出num个字节的内存空间,比较存储在其中的数据的大小。

p1所指的内存块>p2所指的内存块时,返回大于0的整数;

p1<p2时,返回小于0的整数;

p1=P2时,返回0。

4.2 函数的使用

(需注意,第三个参数的单位是字节而非元素)

#include <stdio.h>
#include <string.h>

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 1,2,3,4,4,6,7,8,9,10 };
	char arr3[] = "abcde";
	char arr4[] = "abbde";
	int i = memcmp(arr1, arr2, 5*sizeof(int));//第三个参数的单位是字节
	if (i > 0)
		printf("arr1>arr2\n");
	else if (i < 0)
		printf("arr1<arr2\n");
	else
		printf("arr1=arr2\n");
	int j = memcmp(arr3, arr4, 5);
	if (j > 0)
		printf("arr3>arr4\n");
	else if (j < 0)
		printf("arr3<arr4\n");
	else
		printf("arr3=arr4\n");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值