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

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一个空指针类型的变量,指向待拷贝空间的地址处
sourceconst void* 指针类型的变量,指向拷贝内容的空间地址处
numsize_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函数的模拟实现。

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

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

  • 64
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
C语言中,我们可以模拟实现memcpy函数memcpy函数的原型为void * memcpy(void * destination, const void * source, size_t num),它的作用是将源地址(source)指向的内存块的数据拷贝到目标地址(destination)指向的内存块中,拷贝的字节数由第三个参数num指定。 要实现memcpy函数,我们可以按照以下步骤进行操作: 1. 首先,我们需要创建一个与源内存块相同大小的目标内存块,并将目标内存块的地址保存在destination指针中。 2. 接下来,我们使用一个循环来逐字节地将源内存块的数据复制到目标内存块中,直到拷贝的字节数达到了num的值。 3. 最后,我们返回目标内存块的地址(destination指针),作为函数的返回值。 下面是一个示例的实现代码: ```c void *my_memcpy(void *destination, const void *source, size_t num) { char *dest = (char *)destination; const char *src = (const char *)source; for (size_t i = 0; i < num; i++) { dest[i = src[i]; } return destination; } ``` 在这个实现中,我们将destination和source指针都转换为char类型的指针,这样可以逐字节地进行数据拷贝。然后,我们使用一个循环来逐字节地将源内存块的数据复制到目标内存块中,直到拷贝的字节数达到了num的值。最后,我们返回目标内存块的地址作为函数的返回值。 这样,我们就实现了一个简单的memcpy函数模拟实现。需要注意的是,这只是一个简单的示例实现,实际的memcpy函数可能会有更复杂的实现方式,具体实现可能因编译器和操作系统的不同而有所差异。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值