memcpy
由 source指向地址为起始地址的连续n个字节的数据复制到以destination指向地址为起始地址的空间内。格式如下
void * memcpy ( void * destination, const void * source, size_t num );
说明:
1、函数返回一个指向desinationt的指针。搭配头文件#include<string.h>使用
2、source和destination所指内存区域不能重叠
3、与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。
4、strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度
5、如果目标数组destination本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址
应用如下:
拷贝结构体代码如下
1. #include <stdio.h> 2. #include <string.h> 3. struct { 4. char name[40]; 5. int age; 6. } person, person_copy; 7. int main() 8. { 9. char myname[] = "Pierre de Fermat"; 10. memcpy(person.name, myname, strlen(myname) + 1); 11. person.age = 46; 12. memcpy(&person_copy, &person, sizeof(person)); 13. printf("person_copy: %s, %d \n", person_copy.name, person_copy.age); 14. return 0; 15. }
结果如下
注意 :source和destination所指内存区域不能重叠。num的单位为字节
模拟实现memcpy
模拟实现memmcpy,只需要从source指向地址为起始地址连续n个字节的数据复制到以destination指向地址为起始地址的空间内即可,注意因为memcpy可以拷贝任何数据,所以这里我们无论函数的返回值还是参数都应该为void*
my_memcpy格式如下
void* my_memcpy(void* dest, const void* src, size_t num)
实现代码如下
1. //void* my_memcpy(void* dest, const void* src, size_t num) 2. //{ 3. // void* ret = dest;//记录起始地址 4. // assert(src && dest);//断言,防止传进来空指针 5. // 6. // while (num--)//循环num次,复制num个字节 7. // { 8. // *(char*)dest = *(char*)src;//以char*为单位,强制转换为char* 9. // dest = (char*)dest + 1; 10. // src = (char*)src + 1; 11. // } 12. // return ret; 13. //}
关于强制转换为char*的意义图解
1. // dest = (char*)dest + 1; 2. // src = (char*)src + 1;
注意: 此处代码不可以用dest++和src++进行代替。原因是虽然上一句代码进行了数据转换,但是那只是临时转换,如果用dest++,那么一次跳过的就不是一个字节了,而是dest所对应的字节;而按照上述代码书写则一次只跳一个字节。
memmove
memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。格式如下
void * memmove ( void * destination, const void * source, size_t num );
说明:
如果源空间和目标空间出现重叠,就得使用memmove函数处理
使用如下
模拟实现memmove
模拟实现memove只需要想怎么才处理重叠源内存块和目标内存块就好,实现格式如下
void* my_memmove(void* dest, const void* src, size_t num)
这里我们可以分情况进行讨论
其他情况便可以从前向后进行复制
具体函数实现如下
1. //void* my_memmove(void* dest, const void* src, size_t num) 2. //{ 3. // void* ret = dest;//记录起始地址 4. // assert(dest && src);//断言 5. // 6. // if (dest < src) 7. // { 8. // //前->后 9. // while (num--) 10. // { 11. // *(char*)dest = *(char*)src; 12. // dest = (char*)dest + 1; 13. // src = (char*)src + 1; 14. // } 15. // } 16. // else 17. // { 18. // //后->前 19. // while (num--)//20 20. // { 21. // *((char*)dest + num) = *((char*)src + num); 22. // } 23. // } 24. // return ret; 25. //}
memcmp
比较从ptr1和ptr2指针开始的num个字节 ,可以比较任意类型的数据,格式如下
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
说明:
使用如下
结尾
以上就是博主对内存函数的相关讲解和部分模拟实现,讲解有不清楚或者讲错的地方,可以在评论区或者私信博主.看完记得点赞哦!!!