文章目录
- 1.memcp函数概述
- 2.eg
- 3.strcpy和memcpy
- 4.参考:
1.memcp函数概述
memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);
函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中
(1)函数介绍
- 函数原型
void *memcpy(void *destin, void *source, unsigned n); - 参数
destin– 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
source– 指向要复制的数据源,类型强制转换为 void* 指针。
n– 要被复制的字节数。 - 返回值
该函数返回一个指向目标存储区destin的指针。 - 功能
从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。
所需头文件
C语言:#include
C++:#include
(2)使用说明
- 1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针。
- 2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
注意:source和destin都不一定是数组,任意的可读写的空间均可。
(3)具体实现
windows中:
C语言:
注意:
(1)void* 一定要返回一个值(指针),这个和void不太一样;
(2)首先要判断指针的值不能为空,desc为空的话肯定不能拷贝内存空间,src为空相当于没有拷贝;
(3)””空串是指内容为0,NULL是0,不是串,两个不等价;
(4)int dest[2] = {0};这是对int 类型的数组初始化的方法;如果是char类型,就用char a[5] = “1234”; 注意数组下标要多于实际看到的字符数,因为还有’/0’
(5)printf((char *) dest ); 是把 char 类型 src 传到 int 类型的 dest的内存强制转化成char类型,然后打印出来;
因为直接看int类型的dest是看不到里面的内容的;因为有unsigned char desc1 = (unsigned char)desc;所以字符可以传到dest里面保存起来,dest所指向的内存长度4个字节,强制转化为char ,就是把四个字节分成一个一个的字节,这样就可以看到一个个字符了,如果定义成char dest[5] = “1234”;就不用转化;
(6)memcpy1(dest,src,sizeof(src));注意里面的sizeof(src),这个是包括字符串的结束符’ ’的;所以不用担心printf(dest);
但是如果用memcpy1(dest,src,4),没有’ ’就要*(dest+5) = ‘ ’;这样保证是一个完整的字符串;
2.eg
- eg1:作用:将s中的字符串复制到字符数组d中。
输出结果:Golden Global View
- eg2:将s中第13个字符开始的4个连续字符复制到d中。(从0开始)
输出结果: View
- eg3:复制后覆盖原有部分数据
输出结果:
destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
destination after memcpy: ******************************as6
3.strcpy和memcpy
(1)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
(2)复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符”