前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >打开C语言常用内存函数的大门(一) —— memcpy()函数 (内含讲解用法和模拟实现)

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

作者头像
埋头编程
发布2024-10-16 17:18:38
2560
发布2024-10-16 17:18:38
举报
文章被收录于专栏:C/C++

1. 前言

在之前写的文章中,我介绍了几个比较常用的字符串函数strlen、strcmp、strcpy。它们作用的对象只能是形如字符串类型的数据。 那这难免会引起我们心中一泡浓厚的求知欲——C语言有没有给我们提供一些类似于字符串函数的功能,但是这些函数的作用对象是所有的数据类型呢?如果你是这么想的,那么恭喜你🎇🎇🎇来对地方了。

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

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

2. memcpy函数

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

2.1 memcpy函数的原型

memcpy函数的原型
memcpy函数的原型
代码语言:javascript
复制
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函数的演示
memcpy函数的演示

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

可这时有的读者就会问了,不就是数组内容的拷贝麻,我直接用循环就能解决,为什么还要这么麻烦? 先不要着急,还记得在文章的开头我讲过,memcpy()函数可以拷贝任意类型的数据!!!

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

memcpy函数的演示
memcpy函数的演示

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

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

4. memcpy函数的模拟实现

学会了如何使用memcpy函数后,下面我们来个进阶的知识点——模拟memcpy函数的实现。 这么做是为了让读者们对memcpy()函数的理解更上一层楼,这也正是我们学习的初衷——用知识武装自己,有技术征服他人。

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

memcpy函数的模拟实现
memcpy函数的模拟实现

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

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

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

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

5. 总结

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. memcpy函数
    • 2.1 memcpy函数的原型
      • 2.2 memcpy函数的形参和返回值详解
      • 3. memcpy函数的演示
      • 4. memcpy函数的模拟实现
      • 5. 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档