1.memcpy函数
memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;
函数原型:void *memcpy(void *dest, void *src, unsigned int count);
用法:可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可以是int*,short*,char*等等,但是由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为char*,这样在指针加的时候才会保证每次加一个字节;
#include <stdio.h> #include <iostream> #include <assert.h> using namespace std; /********memcpy()函数原型为:void* memcpy(void* dest, void* src, size_t n); 返回指向dest的空类型指针*********/ //返回void* 类型的原因,是为了使用链式表达,即strlen((char*)(memcpy(dest,src,n)),这样可以直接计算dest的长度,是程序代码更简洁 /****注意void* 指针的使用,即该函数允许传入任何类型的指针数据****/ void* memcpy(void *dest, void *src, size_t n) { assert((dest != NULL) && (src != NULL)); char *dest_t = (char*)dest; //转换成字符型一个个复制拷贝,由于函数拷贝的过程是一个字节一个字节的拷贝的, //所以实际操作的时候要把void*强制转化为char*, char *src_f = (char*)src; //这样在指针加的时候才会保证每次加一个字节 while (n-- > 0) { *(dest_t++) = *(src_f++); } return dest;//void* 一定要返回一个值(指针),这个和void不太一样!函数返回指向dest的指针 } int main() { int a[5] = { 0, 1, 2 }; int *b = new int[3]; void *c = memcpy(b, a, 3 * sizeof(int)); //sizeof()可以用类型做参数,也可以传入实际的变量 for (int i = 0; i < 3; i++) //数组做参数时,不退化为指针,统计的是数组整体占据的内存 { cout << b[i] << endl; } int *temp = (int*)c; temp++; cout << endl; cout << *temp << endl; return 0; }
注1:与strcpy相比,memcpy并不是遇到' '就结束,而是一定会拷贝完n个字节。
2:如果目标数组dest本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。
//memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度; char a[100], b[50]; memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。 strcpy就只能拷贝字符串了,它遇到'