C语言学习笔记---数据拷贝函数memcpy()和memmove()函数
在C语言中拷贝字符串的时候通常可以使用strcpy()函数和strncpy()函数,这两个函数是专门针对字符串拷贝的。如果想要拷贝其他类型数组的话,可以使用memcpy()和memmove()函数。
下面就来看一下这两个函数的使用方法。
memcpy()函数
函数原型如下:
void * __cdecl memcpy(void * __restrict__ _Dst,const void * __restrict__ _Src,size_t _Size)
这个函数有三个参数,第一个是目标数组的地址,第二个是源数组的地址,第三个是要拷贝的字节数。这个字节数不是指的元素个数,而是元素所占的总空间大小。比如对于一个 int 型数组而言,如果要拷贝5个元素,那么第三个参数就要填 5 * sizeof(int),而不是5。
前两个参数里面都带有关键字 restrict ,restrict 用来定义指针变量,表明该变量没有别名,意思就是:除了该变量以外,没有别的方法可以访问其指向的地址空间。也就是拷贝的两个数组地址不能重叠,在拷贝的过程中会直接将源地址的数据拷贝的目的地址,而不是先将数据拷贝到缓存区,然后在拷贝到目的地址。所以使用memcpy()函数拷贝数据的时候,一定要确保两个地址没有重叠,否则就会出现未知的错误。
下面通过一个例子来演示:
int value1[10] = {0,1,2,3,4,5,6,7,8,9};
int value2[10];
int main()
{int n = 0;memcpy(value2,value1,10*sizeof(int));for(n=0; n<10; n++)printf("%d ",value2[n]);system("pause");return 0;
}
将数组1的内容拷贝到数组2中,然后打印数组2中的内容。输出结果如下:
如果源地址和目的地址重叠,会发生怎样的情况?
将value1数组的值拷贝到value1数组中,从输出的结果来看,value1中的值也正常输出了。但是地址重叠后函数输出的结果是未知的,有可能数据正确,也有可能数据不正确。所以尽量避免地址重叠。
在拷贝数据的时候不一定都从数据的起始位置开始,也可以设置从指定的位置开始。比如修改代码如下:
int value1[10] = {0,1,2,3,4,5,6,7,8,9};
int value2[10];
int main()
{int n = 0;memcpy(value2+5,value1+3,5*sizeof(int));for(n=0; n<10; n++)printf("%d ",value2[n]);system("pause");return 0;
}
从value1数组中第3个元素开始,拷贝5个元素到value2数组中第5个元素位置开始处。打印结果如下:
可以看到value2数组中前5个元素都是0,后面5个元素的值是value1中第3个元素开始的数字。
memmove()函数
函数原型是:
void *__cdecl memmove(void *_Dst,const void *_Src,size_t _Size)
memmove()函数原型和memcpy()函数原型基本一样,只是参数里面没有关键字__restrict__ ,说明这个函数在拷贝数据的时候,是不检测地址的,它会先将数据拷贝到一个临时的缓冲区中,然后从缓冲区中再将数据拷贝出去。所以用它拷贝数据的时候,就是地址有重叠,也不会破坏数组中原有的数据。
下面使用代码来测试:
int value1[10] = {0,1,2,3,4,5,6,7,8,9};
int value2[10];
int main()
{int n = 0;memmove(value2,value1,10*sizeof(int));for(n=0; n<10; n++)printf("%d ",value2[n]);system("pause");return 0;
}
将数组1的内容拷贝到数组2中,然后打印数组2中的内容。输出结果如下:
也可以从数组指定位置开始拷贝。
源地址和目的地址可以重叠。
这两个函数不仅可以拷贝整形数组,还能拷贝其他类型的数据,比如浮点型数组,结构体等。
C语言学习笔记---数据拷贝函数memcpy()和memmove()函数相关推荐
- C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- C语言学习笔记(1)--基本概念和函数用法
最近开始重新学习C语言,所谓"好记性不如烂笔头",把一些要记住的基本概念和一些函数用法,无论是书上看到的,或者是在别人的博客和论坛上帖子看到的,都归纳到这篇文章中: 2014-10 ...
- c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- R语言学习笔记--数据框输出和查看
(1)将数据框C输出为.csv文件 write.table(C,file="ABC.csv",sep = ",",row.names=FALSE) #A ...
- C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)
C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址. 取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符 地址的大小 ...
- c语言中void arrout,c语言学习笔记(数组、函数
<c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...
- r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数
在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...
- C语言学习笔记(8)函数
C语言学习笔记(8)函数 函数 函数主要是用于将解决复杂的编程问题分解为数个可以分开进行解决的小问题,通过函数分装,最后在拼连在一起.有利于多人协作开发. 函数同样需要先声明后调用,声明符号为 voi ...
最新文章
- PYTHON 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者...
- iOS之百度导航SDK的坐标转换
- java邮件教程_Java发送Email/邮件
- ScriptManager 帮助您实现 Web 应用程序的 AJAX 功能
- 【运筹学】人工变量法总结 ( 人工变量法解的分析 | 标准型变换 | 构造单位阵 | 目标函数引入 M | 计算检验数 | 选择入基变量 | 选择出基变量 | 中心元变换 | ) ★★
- unity创建一个简单对象的开销_Unity下简单对象池的创建与使用
- Spring Tool Suite记录
- FileEncodingApplicationListener使用以及原理
- unity中实现简单对象池,附教程原理
- 基于Promise对象的新一代Ajax API--fetch
- 搜狗发布全球首位 3D AI 主播,背后分身技术有玄机
- 图形界面组件实验的一点总结
- 怎样在视频上加字幕,分享视频添加字幕的小技巧
- 舞蹈课 (C++堆的优先级与重载)
- Ruby注释的写法 Markup
- SAP物料主数据编码范围配置
- excel合并单元格和左对齐
- 博途PLC和CODESYS平台下FB编程应用(如何实例化多个FB)
- java 公交管理系统 代码_基于jsp的公交管理系统-JavaEE实现公交管理系统 - java项目源码...
- package.json文件解读