打开C语言常用内存函数的大门(一) —— memcpy()函数 (内含讲解用法和模拟实现)

埋头编程~ 2024-10-21 10:35:01 阅读 63

文章目录

1. 前言2. memcpy函数2.1 memcpy函数的原型2.2 memcpy函数的形参和返回值详解

3. memcpy函数的演示4. memcpy函数的模拟实现5. 总结

1. 前言

在之前写的文章中,我介绍了几个比较常用的字符串函数strlen、strcmp、strcpy。它们作用的对象只能是形如字符串类型的数据。

那这难免会引起我们心中一泡浓厚的求知欲——C语言有没有给我们提供一些类似于字符串函数的功能,但是这些函数的作用对象是所有的数据类型呢?如果你是这么想的,那么恭喜你🎇🎇🎇来对地方了。

C语言的确提供了这种函数,在C语言中被称为内存函数。

下面我将讲解,常用的内存函数之一的memcpy函数。(还有几个常用的内存函数,会在之后的文章中一一介绍,敬请期待😊)

2. memcpy函数

memcpy()函数,就是内存拷贝函数

作用:将指定内存空间的内容拷贝到你想要存放的内存空间处。但前提是你想要存放的内存空间大小得容纳得下待拷贝的内容。

2.1 memcpy函数的原型

memcpy函数的原型

void * memcpy ( void * destination, const void * source, size_t num );

简单观察一下,你会发现,这个函数的返回值是个void*指针。形参有两个void*指针,其中还有一个带有const限定符修饰,另外还有一个size_t类型的变量。

那么下面,我将介绍memcpy函数各参数的和返回值分别代表的是什么含义。(希望读者们能够学会使用memcpy函数)

2.2 memcpy函数的形参和返回值详解

在开始之前,我先放上一张看来自官网的参数和返回值解释(英语好的读者们直接看就可以了)

形参和返回值

返回值和形参 作用
返回值类型:void* 返回目的地空间的地址。(说大白话,就是返回你想要拷贝内容到那个空间的地址,不过我们很少会用到它的返回值)
destination 一个空指针类型的变量,指向待拷贝空间的地址处
source const void* 指针类型的变量,指向拷贝内容的空间地址处
num size_t类型的变量 , 表明我要拷贝多少个字节数的内容

相信读者们看完上面的表格后,已经知道memcpy函数该如何使用了。

如果还没有什么感觉的话,没有关系,下面我就带着各位去写代码感受一下memcpy函数的魅力所在

3. memcpy函数的演示

在演示之前,先说明一下,memcpy()作为C语言中的库函数,在使用之前我们得先引用一个头文件<string.h>

memcpy函数的演示

可以看到,arr1中的数据确实拷贝到了arr2数组上去了。

可这时有的读者就会问了,不就是数组内容的拷贝麻,我直接用循环就能解决,为什么还要这么麻烦?

先不要着急,还记得在文章的开头我讲过,memcpy()函数可以拷贝任意类型的数据!!!

下面我就展示一个拷贝结构体内容的代码:

memcpy函数的演示

可以看到,结构体的内容也是能够进行的拷贝的。

那么讲到这里,memcpy函数的演示使用就结束了。读者们如果感兴趣的话,可以试多几个不同的数据类型,看看能否拷贝成功。

4. memcpy函数的模拟实现

学会了如何使用memcpy函数后,下面我们来个进阶的知识点——模拟memcpy函数的实现。

这么做是为了让读者们对memcpy()函数的理解更上一层楼,这也正是我们学习的初衷——用知识武装自己,有技术征服他人。

为了方便讲解,我先给出模拟代码:

memcpy函数的模拟实现

如果有看过我之前文章的读者,相信对这种方式已经不陌生了。

这里就主要讲一下,为什么dest和src要强制转换为(char*)类型的原因:

第一点:我们无法对void*类型的指针进行解引用操作和指针偏移的操作,这就是我们需要强制转换的根本原因;第二点:我们之所以选择强转char*指针类型,是因为memcpy函数面向的数据类型是未知的。但是我们不能被这种未知的情况所打到,于是乎我们仔细的想了一下,既然数据在内存中是以字节为单位存储的,换句话说字节就是内存中最小的度量单位了那么我们就明白了,用char*指针能访问一个字节内容的大小。这样做的话,即使我们不知道具体的数据类型,也可以通过传进来的字节个数,确定我要对这个char*指针偏移的次数,从而实现精准的拷贝。

模拟实现

可以看到,结果是没有什么问题滴。

5. 总结

在本文中,我介绍了memcpy函数的返回值和各个形参的含义、memcpy函数如何使用以及memcpy函数的模拟实现。

希望读者们能够好好学习,学有所成!!!👍👍👍

最后,如果觉得本文写的还不错的话,不要吝啬你们手中的赞哦。🙏🙏🙏



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。