C语言——来认识内存函数吧~

        函数是C语言必不可少的组成,这篇文章带你来了解我们的内存函数

        1.memcpy函数

目录

        1.memcpy函数

        2.memmove函数

         3.memcmp函数

        4.memset函数


这是一个内存拷贝函数,我们先来看它含参情况以及返回值情况:

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

 

 memcpy含三个参数,两个指针一共int型变量(这里的size_t是我们的无符号整型unsigned int)

三个参数的意义如下:

根据如上定义我们便可对该函数进行使用:(注意memcpy的头文件是<string.h>)

 它可以将各种类型的变量由源地址复制到目的地址处,并且传递大小由自己来设定,接下来我们自己模拟实现memcpy函数:

#include<stdio.h>
#include<string.h>
void *my_memcpy(void *d,const void *s,size_t sz)
{
	void* ret = d;
	while (sz--)
	{
		*(char*)d = *(char*)s;
		d = (char*)d + 1;
		s = (char*)s + 1;
	}
	return ret;
}
int main()
{
	int arr1[10] = { 0 };
	int arr2[] = { 1,2,3,4,5 };
	my_memcpy(arr1, arr2, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

我们自己的memcpy中三个参数需完全与定义的函数相同保证统一性。

        2.memmove函数

这是一个内存移动函数,我们来观察它的含参情况和返回类型:可以观察到它与momcpy及其相似,参数意义也一模一样,那么区别在哪里呢

 

 它是用来拷贝重叠内存的函数,就是将arr2数组中的3,4,5,6,7的位置这些数据变为1,2,3,4,5的数据——也就是memcpy自己拷贝自己时所用memmove函数。

它的功能如下所示:

 将arr数组中下标为15的地址的元素复制到下标为20的地址中,便有了如上结果。当然我们也要模拟实现这个函,我们先来简易分析: 

如上分析来编写自己的memmove函数:

#include<stdio.h>
#include<string.h>
void *my_memcpy(void *d,const void *s,size_t sz)
{
	void* ret = d;
	if (d < s)//将s由前往后放置
	{
		while (sz--)
		{
			*(char*)d = *(char*)s;
			d = (char*)d + 1;
			s = (char*)s + 1;
		}
	}
	else//将s由后往前放
	{
		while (sz--)
		{
			*((char*)d + sz) = *((char*)s + sz); 
		}

	}
	return ret;
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memcpy(arr1, arr1+2, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

         3.memcmp函数

我们来观察它的含参情况和参数意义以及返回类型

 

 

 由以上我们可以进行memcmp函数的使用:

比较了arr1和arr2的大小,比较范围是20个字节,所以我们返回的是大于0的数——1。

接下来我们模拟实现一下memcmp:

#include<stdio.h>
#include<string.h>
int my_memmove(const void *s1,const void *s2,size_t sz)
{
	while (sz--)
	{
		if (*(char*)s1 == *(char*)s2)
		{
			s1 = (char*)s1 + 1;
			s2 = (char*)s2 + 1;
		}
		else if (*(char*)s1 > *(char*)s2)
		{
			return 1;
		}
		else
		{
			return -1;
		}
	}
	return 0;
}
int main()
{
	int arr1[] = { 1,2,3,0,5 };
	int arr2[] = { 1,2,3,0,5 };
	int ret = my_memmove(arr1, arr2,20);
	printf("%d", ret);
	return 0;
}

        4.memset函数

内存设置函数——可以以字节为单位修改内存,我们来看看它的参数情况和返回类型:

(这个函数我们不做模拟实现)

 实际应用如下:

我们可以看到它将arr数组的前四个字节修改成了0。

以上便是小编认识的四种内存函数,希望大家多多支持哈~

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值