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 并不是遇到'\0'就结束, 而是一定会拷贝完 n 个字节.
2: 如果目标数组 dest 本身已有数据, 执行 memcpy() 后, 将覆盖原有数据 (最多覆盖 n).
- //memcpy 用来做内存拷贝, 你可以拿它拷贝任何数据类型的对象, 可以指定拷贝的数据长度;
- char a[100], b[50];
- memcpy(b, a,sizeof(b)); // 注意如用 sizeof(a), 会造成 b 的内存地址溢出.
strcpy 就只能拷贝字符串了, 它遇到'\0'就结束拷贝; 例:
- char a[100], b[50];
- strcpy(a,b);
2.strcpy 函数
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- /********strcpy() 函数原型为: char *strcpy(char* dest, const char *src); 返回指向 dest 的指针 *********/
- // 返回 char* 类型的原因, 是为了使用链式表达, 即 strlen(strcpy(dest,src)), 这样可以直接计算 dest 的长度, 是程序代码更简洁
- char* strcpy(char *dest, char *src)
- {
- if(dest == NULL || src == NULL)
- return NULL;
- char *res = dest;// 保存原始 dst 的首地址
- while(*src != '\0')
- {
- *dest = *src;
- dest++;
- src++;
- }
- *dest = '\0';
- return res;
- }
- int main()
- {
- char *src = "hello world";
- char *dest = new char;
- //strcpy(dest,src);
- int len = strlen(strcpy(dest,src));
- cout << len << endl;
- cout << dest << endl;
- return 0;
- }
来源: http://www.bubuko.com/infodetail-2735844.html