1.memcpy
与字符串函数 strcpy 类似,也是进行拷贝。但是需要注意的是,strcpy 是针对字符串进行拷贝,而 memcpy 是针对内存进行拷贝。
如何理解呢?strcpy 进行拷贝的时候,只能一个字节一个字节的拷贝,但要实现 整型、浮点型等数据类型拷贝的时候,就不得不用到 memcpy 了。
我们观察 strcpy 的函数声明:
char * strcpy ( char * destination, const char * source );
再观察 memcpy 的函数声明:
void * memcpy ( void * destination, const void * source, size_t num );
可以看到 strcpy 的局限在于只能接收 字符型 的指针,但 memcpy 对于类型可以在函数内部实现自定义。
我们浏览cplusplus对参数作出的解释:
现在我们要研究如何使用:
#include <stdio.h> #include <string.h> int main() { int dest[10] = { 0 }; int src[10] = { 1,2,3,4,5,6,7,8,9,10 }; memcpy(dest, src, 20);//拷贝 20 个字节 return 0; }
我们从 src 数组中,拷贝 20 个字节的数据放到 dest 数组中。那么我们通过 调试—窗口—监视来观察 dest 数组中的变化:
未经 memcpy 前:
经 memcpy 后:
可以直观地看到, dest 数组中前 20 个字节的内容发生了改变。
使用起来倒是不复杂,那我们能不能用自己的代码去模拟实现一个 memcpy 函数?
#include <stdio.h> void* analogmemcpy(void* dest, const void* src, unsigned int num) { void* start = dest;//定义一个记录 dest 初始地址的指针 while (num--)//一个字节一个字节拷贝 { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return start;//返回此指针 } int main() { int dest[10] = { 0 }; int src[10] = { 1,2,3,4,5,6,7,8,9,10 }; analogmemcpy(dest, src, 20); return 0; }
我们的实现思路非常简单,因为官方给出第三个参数的定义是:要复制的字节数。那我们顺水推舟一个字节一个字节的拷贝。
但是到这里,可能会存在这样一个问题: char 类型是一个字节,我们使用 memcpy 时也是一个字节一个字节的拷贝,那为什么 strcpy 不能拷贝整型?
在我们自己模拟实现 strcpy 的时候,拷贝的停止条件是什么?是 src 字符串碰到 '