内存函数(C语言进阶)

目录

前言

1、memcpy

2、memmove

3、memcmp

4、memset      

结语


前言

        本篇介绍了C语言中的内存函数,内存函数,顾名思义就是处理内存的函数。

1、memcpy

        memcpy:内存拷贝函数。

        相对于strcpy只能拷贝字符串来讲,memcpy能拷贝其他类型的数据。

        举例子:

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

效果:

        memcpy用法讲解:

        它包括三个参数,第一个参数为要拷贝到的目标地址,第二个参数为被拷贝的内容地址,第三个为拷贝的字节大小。如上面这个例子,我们要将arr1拷贝到arr2中,前两个参数就是他们的首地址,第三个参数是根据整型数据一个大小为4,arr1中有7个整型,所以计算得拷贝得数据大小为28。这样就可以达到我们想要的效果。

        注意一个特殊情况,memcpy不用于处理重叠的内存之间的数据拷贝,如:将一个数组arr[]={1,2,3,4,5,6,7,8}; 它的前4个元素拷贝到它的第3到7个元素的位置,这时就会出错,因为当我要将第3个数拷贝到第6个位置是,其实第三个数在前面已经被第一个数覆盖了。但是在vs编译器中memcpy是可以实现重复内存操作的,实际上memcpy是没有这样的功能要求的,是vs自己改进了。

        如果需要在重叠内存间进行数据拷贝,实际要用到函数:memmove

2、memmove

        memmove函数从参数上和功能上都和memcpy是一样的,但是它可以对有重叠内存的数据之间进行拷贝。

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

        实现了这样一个内存重叠的操作。

3、memcmp

        我们可以参照函数strcmp,memcmp函数就是在strcmp的基础上,扩大了它所作用的数据类型,它可以对内存中任意的两个数据进行比较。那它是怎么用的呢,我们来看一个例子:

#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,3,2 };
	int ret = memcmp(arr1, arr2, 12);
	printf("%d\n", ret);
	return 0;
}

看看输出:

        先来讲讲memcmp的三个参数,它的前两个参数放的是需要比较的两组数据的其实地址,第三个参数放的是比较数据的大小(字节)。上面这个例子,我们将两个数组的名字(首地址)作为前两个参数(比较对象),最后输入了一个12,代表我们要比较12个字节的数据,也就是3个整型的数据,输出结果来看,它输出了-1,意思是arr1没有arr2大。这是因为我们只限制了比较前三个整型数据,因此arr2和arr1第一个元素相同,第二个元素arr2大于arr1,尽管后面arr1第三个数据大于arr2,但是这个函数是从前往后比的,所以只看第一个出现不同的位置之间的数据大小,后面就不管了,所以整体arr2大于arr1,所以输出-1。

        对于memcpy的输出,如果被比较的两个数据前者大于后者,返回1;前者等于后者,返回0;前者小于后者,返回-1。

4、memset      


         memset:内存设置函数,用于设置内存。

        先看一个例子:

#include<stdio.h>
int main()
{
	char arr[] = "hello world";
	memset(arr, 'x', 5);
	printf("%s\n", arr);
	return 0;
}

效果:

        先看memset的三个参数,第一个参数是被设置的内存地址,第二个参数是要设置的内容,第三个参数是需要设置的大小。

        例如上面这个例子,我们想要将arr这个字符串的前五个字符设置成x,我们就可以如上这样子使用,最后达成我们预期的效果。

        memset函数常用来初始化。注意,对于整型数据来讲,如果用memset来初始话,就只能用来初始化0,不能初始化1,因为memset是以一个字节为单位进行初始化的,如果初始化1,则对于整型数据来说,初始化的其实是01 01 01 01。

结语

        对于内存函数,就讲到这了,如果对你有所帮助,我会很开心。

  • 52
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

彭逍遥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值