函数是C语言必不可少的组成,这篇文章带你来了解我们的内存函数
1.memcpy函数
目录
这是一个内存拷贝函数,我们先来看它含参情况以及返回值情况:
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。
以上便是小编认识的四种内存函数,希望大家多多支持哈~