每天深解一个字符串类函数之memcpy函数

目录

前言:

一、头文件

二、memcpy函数的作用

三、理解memcpy函数的定义

1、返回类型

2、参数

附:各常见类型数据大小(单位字节)

四、使用memcpy函数

代码部分

监视器查看

​编辑 五、注意要点

六、模拟实现memcpy函数 


前言:

本文包含对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字节刚好可以是拷贝大小的基本单位。

每日一学,今天你又超过了百分之九十九的人。

如果本篇文章对你有帮助,请点个关注和赞吧!

如果对本篇文章有疑惑,欢迎在评论区讨论。

注:“每天学习一个字符串类函数”类型文章已整理为专栏,欢迎大家订阅。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值