在之前的两篇博客中,我讲到了字符函数以及字符串函数。在前面的两篇博客中我讲的函数全部都是只适用于字符类型的数据。但是大家想一想,在C语言中,又不止字符型的变量。所以,在C与语言中,我们又有一些函数,用来使用,它们就是内存函数,这些函数在使用的时候的特点就是。它们不限定类型,只要是存贮在内存中的函数都可以使用这些函数。好了,废话不多说,接下来我将给大家展示一下这些函数。
1.memcpy使用和模拟实现
今天讲的第一个函数就是我们的memcpy函数,这个函数,就像他的前缀一样,mem就是memory的意思,就是代表内存的意思。好了,接下来,我来给大家展示一下这个函数的一般形式,大家请看下面的代码块。
cpp
void * memcpy (void * destination,const void * source, size_t num);
功能:这个函数是将source中的数据看拷贝到destination中去。拷贝的数据个数是num个字节。这个函数再拷贝数据的时候不会限定数据的类型。再次强调一下,这个num的单位是字节,所以大家不要搞错了
这个函数在使用的时候需要包含<string.h>这个头文件。
特殊情况:如果destination和source中的数据有重复的部分,就不能使用这个函数。
返回值:返回的都是目标空间的起始位置。
好了,接下来,我来给大家演示一下这个函数的使用,大家请看下面的图片。

上面的代码展示的就是这个函数的作用了,这是我通过调试的结果,所以大家也可以自己在编译器上尝试尝试。接下来,我来给到大家模拟实现一下这个代码,这样会让大家理解更深刻,大家请看下面的模拟代码的图片。

上面的代码就是我们自己实现的一个memcpy的函数代码,在这里我想要强调几点。因为我们自己写的函数的返回类型是void*型,这个类型不能直接解引用,需要强制类型转换之后才可以使用,相比之下,因为这个函数的num的单位是字节,所以强制转化成char*型是最好的,因为char*这种类型的长度为一个字节。这就是我想强调的地方了,大家也可以在编译器上自己试着敲一下这个代码。
2.memmove使用
接下来这个函数,和上面的函数很像。大家是否还记得我在上文写到了memcpy在对于重复的数据时,是无法起作用的,那么我们该怎么办呢?接下来就该我们的memmove出场了,这个函数对于重复的两个数据能够起作用。接下来,我来给大家展示一下这个函数的一般形式,大家看下面的代码块。
cpp
void * mememove (void * destination,const void * source,size_t num);
其实大家发现没有,这个形式和上面的memcpy的形式是一样的,所以它们的参数也都是相同的功能。只不过这个函数可以用在重叠的数据上。接下来,我就来给大家展示一下这个函数的使用,大家请看下面的代码图片。

这就是这个函数在遇到重叠的部分的强大之处。因为我这个编译器时vs2022,所以这个编译器在设定memcpy和memmove的时候设定是一样的,所以对于我这个编译起来说,memcpy也可以解决重叠的情况。所以在这里我无法给大家展示出区别,但是在其他的编译器上这两个函数是一定有区别的,而且memmove这个函数更加的灵活,要是感兴趣的朋友,可以在其他的编译上尝试一下,就用我上面的那段代码。
3.memset的使用
接下来的这个函数,大家听名字应该就知道了,这是设置函数,可以将特定长度的数据设置为自定义的内容。接下来,我来给大家展示一下这个函数的一般形式,大家看看下面的代码块。
cpp
void * memset (void * ptr,int value,size_t num);
参数:ptr指针指向的是被设置内用的空间,value是要设置的内容,num是要设置的长度,单位为字节。这个函数的返回类型是void*型。返回的是被设置空间的起始位置。接下来,我就来给大家展示一下这个函数的使用,大家请看下面的代码图片。

上面的代码就是这个函数的使用特点,大家也可以自己在编译器上尝试一下。
4.memcmp函数的使用
当然,对于内存中的类容,也是存在一些比较函数的,这个函数就是memcmp。接下来,我来给大家展示一下这个函数的一般形式,大家请看下面的代码块。
cpp
int memcmp (const void * ptr1,const void * ptr2,size_t num);
这个函数的功能就是比较两块指定内存的空间内容。比较从ptr1和ptr2指针指向的位子开始,向后的num个字节。返回的值是一个整型,接下来,我来给大家看看返回值的不同情况。
当ptr1>ptr2时,返回值返回的是大于0的数
当ptr1<ptr2时,返回的是小于0的数
当ptr1=ptr2时,返回值为0.
接下来,我就来给大家展示一下这个函数的使用,大家请看下面的代码图片。

好了,这就是今天博客分享的内容,希望我的博客对你的C语言学习有帮助,我们下一篇博客再见!!!