在之前写的文章中,我介绍了几个比较常用的字符串函数strlen、strcmp、strcpy。它们作用的对象只能是形如字符串类型的数据。
那这难免会引起我们心中一泡浓厚的求知欲——C语言有没有给我们提供一些类似于字符串函数的功能,但是这些函数的作用对象是所有的数据类型呢?如果你是这么想的,那么恭喜你来对地方了。
C语言的确提供了这种函数,在C语言中被称为内存函数。
下面我将讲解,常用的内存函数之一的memcpy函数。(还有几个常用的内存函数,会在之后的文章中一一介绍,敬请期待)
memcpy()函数,就是内存拷贝函数。
作用:将指定内存空间的内容拷贝到你想要存放的内存空间处。但前提是你想要存放的内存空间大小得容纳得下待拷贝的内容。
void * memcpy ( void * destination, const void * source, size_t num );
简单观察一下,你会发现,这个函数的返回值是个void*
指针。形参有两个void*
指针,其中还有一个带有const
限定符修饰,另外还有一个size_t类型的变量。
那么下面,我将介绍memcpy函数各参数的和返回值分别代表的是什么含义。(希望读者们能够学会使用memcpy函数)
在开始之前,我先放上一张看来自官网的参数和返回值解释(英语好的读者们直接看就可以了)
返回值和形参 | 作用 |
---|---|
返回值类型:void* |
返回目的地空间的地址。(说大白话,就是返回你想要拷贝内容到那个空间的地址,不过我们很少会用到它的返回值) |
destination |
一个空指针类型的变量,指向待拷贝空间的地址处 |
source |
const void* 指针类型的变量,指向拷贝内容的空间地址处 |
num |
size_t类型的变量 , 表明我要拷贝多少个字节数的内容 |
相信读者们看完上面的表格后,已经知道memcpy函数该如何使用了。
如果还没有什么感觉的话,没有关系,下面我就带着各位去写代码感受一下memcpy函数的魅力所在
在演示之前,先说明一下,memcpy()作为C语言中的库函数,在使用之前我们得先引用一个头文件
可以看到,arr1中的数据确实拷贝到了arr2数组上去了。
可这时有的读者就会问了,不就是数组内容的拷贝麻,我直接用循环就能解决,为什么还要这么麻烦?
先不要着急,还记得在文章的开头我讲过,memcpy()函数可以拷贝任意类型的数据!!!
下面我就展示一个拷贝结构体内容的代码:
可以看到,结构体的内容也是能够进行的拷贝的。
那么讲到这里,memcpy函数的演示使用就结束了。读者们如果感兴趣的话,可以试多几个不同的数据类型,看看能否拷贝成功。
学会了如何使用memcpy函数后,下面我们来个进阶的知识点——模拟memcpy函数的实现。
这么做是为了让读者们对memcpy()函数的理解更上一层楼,这也正是我们学习的初衷——用知识武装自己,有技术征服他人。
为了方便讲解,我先给出模拟代码:
如果有看过我之前文章的读者,相信对这种方式已经不陌生了。
这里就主要讲一下,为什么dest和src要强制转换为(char*)类型的原因:
- 第一点:我们无法对void*类型的指针进行解引用操作和指针偏移的操作,这就是我们需要强制转换的根本原因;
- 第二点:我们之所以选择强转
char*
指针类型,是因为memcpy函数面向的数据类型是未知的。但是我们不能被这种未知的情况所打到,于是乎我们仔细的想了一下,既然数据在内存中是以字节为单位存储的,换句话说字节就是内存中最小的度量单位了,那么我们就明白了,用char*
指针能访问一个字节内容的大小。这样做的话,即使我们不知道具体的数据类型,也可以通过传进来的字节个数,确定我要对这个char*
指针偏移的次数,从而实现精准的拷贝。
在本文中,我介绍了memcpy函数的返回值和各个形参的含义、memcpy函数如何使用以及memcpy函数的模拟实现。
希望读者们能够好好学习,学有所成!!!
最后,如果觉得本文写的还不错的话,不要吝啬你们手中的赞哦。