内存函数memcmp和memset

这篇博客让我们再来认识两个内存函数,这两个函数也会在我们日后写代码过程中经常遇到的。


目录

1.memcmp(内存比较)

1.1认识函数

1.2函数示例

1.3模拟实现

2.memset(内存设置)

2.1认识函数

2.2函数示例

2.3模拟实现


1.memcmp(内存比较)

1.1认识函数

1.函数功能:比较内存中两个字符的大小,也就是比较大小函数

2.头文件:#include<string.h>

3.使用格式:int memcmp( const void *buf1, const void *buf2, size_t count );

4.函数比较buf1和buf2指针开始后的count个字节

5.函数的返回值:

       buf1>buf2,返回大于0的数

       buf1=buf2,返回0

       buf1<buf2,返回小于0的数

下面让我们来看一下具体实现

1.2函数示例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

//memcmp
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,5,6,7 };
	int ret = memcmp(arr1, arr2, 8);//这里的8代表的是字节数,而不是整型
	printf("ret=%d\n", ret);
	return 0;
}

相信很多小伙伴们不理解问什么ret的值就等于0了,下面我们来分析一下:

arr1 和arr2在内存中的存放位置是这样的(小端存储)

所以就是相等的。

1.3模拟实现


int my_memcmp(const void* ptr1, const void* ptr2, size_t count)
{
	assert(ptr1 && ptr2);
	while (--count)
	{
		if (*(char*)ptr1 == *(char*)ptr2)
		{
			 ptr1=(char*)ptr1 + 1;
			 ptr2=(char*)ptr2 + 1;
		}
		if (*(char*)ptr1 > *(char*)ptr2)
			return 1;
		if (*(char*)ptr1 < *(char*)ptr2)
			return -1;
	}
	return 0;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,5,6,7 };
	int ret = my_memcmp(arr1, arr2, 8);
	printf("ret=%d\n", ret);
	return 0;
}

2.memset(内存设置)

2.1认识函数

1.函数功能:将内存设置为指定的字符,也就是以字节为单位设置内存中的数据

2.头文件:#include<string.h>或者#include<memory.h>

3.函数格式:void *memset( void *dest, int c, size_t count );

4.count:单位是字节

5.memset函数较多用来初始化一块内存,因为它是以字节为单位存放的,如果用来设置值,每个字节都会被设置为这一个值,最后结果肯定与我们需要设置的值不同:

加入,我们要把一个数组的每个值都设置为1,如代码所示:

int main()
{
	int arr[10] = { 0 };
	memset(arr, 1, 40);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

我们看到运行结果并不是预期的每一个数都是1,这是因为,memset函数的单位是字节,也就是内存中计算的是01 01 01 01等40个01,然后一个整型是4个01,换成十进制是16843009

所以,我们一般不把memset函数用来设置值,这样不方便控制

我们通过代码来深度理解

2.2函数示例

//memset
int main()
{
	char arr[] = "hello world!!!";
	memset(arr, '*', 5);
	printf("%s",arr);
	return 0;
}

memset函数进行内存数据设置的时候,不仅能从字符串首地址设置,还能从字符串任意位置开始设置,比如我们要把world设置为“#”,这时,我们只需要让首地址+6,跳过hello和空格开始:

int main()
{
	char arr[] = "hello world!!!";
	memset(arr+6, '#', 5);
	printf("%s", arr);
	return 0;
}

2.3模拟实现

void my_memset(void* ptr, char value, size_t count)
{
	assert(ptr);
	while (count--)
	{
		*(char*)ptr = value;
		ptr = (char*)ptr+1;
	}
}
int main()
{
	char arr[] = "hello world!!!";
	my_memset(arr, '*', 5);
	printf("%s\n", arr);
	return 0;
}


这就是这两个函数了,希望大家可以理解!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月亮夹馍干

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值