目录
前言:
本文包含对memcpy函数标准定义、作用、注意要点、模拟实现各方面的深入讲解,描述清晰,重点突出,可以满足初学或复习者的要求。
一、头文件
memcpy函数虽然说我把它划分到字符串函数一类,但它实际上是争对所有类型的数据的,一般也称其为内存函数。那我为什么将其划分到字符串类函数中呢?
原因很简单,因为我们在使用库函数memcpy函数时,要引用的头文件与字符串类函数相同,都为<cstring> (string.h)。
C语言
#include <string.h>
C++
#include <cstring>
二、memcpy函数的作用
memcpy函数用于拷贝指定长度的数据到目标位置,memcpy函数本质上就是strncpy函数的加强版,将原本只用于字符串的strncpy函数扩用为可以支持所有数据类型的,所有称其为内存函数。
三、理解memcpy函数的定义
void * memcpy ( void * destination, const void * source, size_t num );
1、返回类型
在C语言标准库函数的定义中,memcpy函数的返回类型为void*(不固定类型的指针),用于返回目标位置的地址,由于指针类型的不固定性,使得函数可以用于返回任意数据类型。
2、参数
在C语言标准库函数的定义中,memcpy函数的参数有三个,第一个为指向目标位置的指针void* destination(不固定类型的指针,可用于接收任意数据类型的指针);第二个为指向源头位置的指针const void* source(不固定类型的指针,可用于接收任意数据类型的指针,前加上const使函数不能通过该指针更改其指向位置的数据);第三个为size_t num代表要拷贝的数据的长度,长度单位为字节,而非任意一个数据类型的大小,这使其可以适应任意类型数据。
附:各常见类型数据大小(单位字节)
四、使用memcpy函数
代码部分
#include <string.h>
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
return 0;
}
监视器查看
函数执行前:
函数执行后:
五、注意要点
1、在使用memcpy函数时要明确要拷贝数据的类型的大小,保证拷贝数据的完整性。(从实际使用意义上看)
2、memcpy函数在C语言标准定义中,是不支持对原数据位置与目标数据位置相交的情况下进行拷贝。(此时我们会用到memmove函数,此函数会在下一篇博客介绍,具体情况也会放在下一篇博客)这里简单提一下部分编辑器如VS,其库函数memcpy是以memmove函数的标准写的,故也可以完成该情况的拷贝。类似于60分便合格,他考了90分。(我们也不能说他考坏了)
六、模拟实现memcpy函数
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
return 0;
}
解释:
*(char*)强制类型转换,void*的指针是不能直接进行加减运算的,而char*的指针的大小是1字节刚好可以是拷贝大小的基本单位。
每日一学,今天你又超过了百分之九十九的人。
如果本篇文章对你有帮助,请点个关注和赞吧!
如果对本篇文章有疑惑,欢迎在评论区讨论。
注:“每天学习一个字符串类函数”类型文章已整理为专栏,欢迎大家订阅。