1. memcpy(); //内存单元复制(不可以自己给自己追加) void * memcpy ( void * dest, const void * src, size_t num ); //目标起始地址,要复制内存单元起始地址 , 复制的数量(单位是字节)
- 函数memcpy从src的位置开始向后复制num个字节的数据到dest的内存位置。
- 这个函数在遇到'\0'的时候并不会停下来。
- 如果src和dest有任何的重叠,复制的结果都是未定义的。
#includeint main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[5] = { 0 }; memcpy(arr2, arr1, 20); //把arr1的20个内存单元复制给arr2 , 单位是字节 } 【C语言|C语言的内存操作函数】
文章图片
2.
memmove(); //内存单元复制 (可以自己给自己追加) void * memmove ( void * dest, const void * src, size_t num ); //目标起始地址,要复制内存单元起始地址 , 复制的数量(单位是字节)
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
文章图片
//arr1 给 arr1自己进行了复制,并且重叠
//如果是上面 模拟实现memcpy 的方法,数据会被替换, 无法实现重叠,结果会是: 12121218910 //err
3.
memset(); //修改内存中的单元, 单位是字节 void* memset( void* dest, int c, size_t count ); //目标起始地址,修改内存单元的起始地址 , 修改的内存单元数量(单位是字节) #includeint main() { int arr[] = { 0x11111111,0x22222222,3,4,5 }; memset(arr, 0, 20); return 0; } 内存单元从:
文章图片
变为:
文章图片
//没有变红的部分,也变0了,只不过本来是0,所以编译器没有变红提示
4.
memcmp(); //内存单元比较, 单位是字节 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); //目标起始地址,比较的内存单元的起始地址 , 比较的数量
- 比较从ptr1和ptr2指针开始的num个字节
- 返回值和strcmp一样:
- >返回>0的值
- ==返回0
- <返回<0的值
文章图片
但是如果比较的元素是18个的话, 就是不相等的, 这是对arr2的第18的内存单元33 进行和arr1的第18的内存单元00 进行比较,
结果返回小于0的值, 不同编译器下会不同, 当前返回的是-1
文章图片
//如果是字符在内存中进行比较,比较的是它们相对应的ASCII码值,
//所以会出现 'A' < 'a' 这种情况,因为'A' 的ASCII码值是:65而 'a' 的ASCII码值是:97
推荐阅读
- c语言实现strcat函数
- C|结构体(初识)
- C|【C语言的灵魂】-指针(2)
- C|C语言的灵魂-指针(1)
- C|数组与字符串
- C|初识C语言(2)-常量,字符串+转义字符,ASCII码,选择语句,循环语句,函数,数组,操作符
- CSE 260
- COMP2017 / COMP9017
- 蓝桥杯学习|【第十三届蓝桥杯单片机省赛冲刺-巩固练习3】