1.
memcpy(); //内存单元复制 (不可以自己给自己追加)
void * memcpy ( void * dest, const void * src, size_t num ); //目标起始地址, 要复制内存单元起始地址 , 复制的数量(单位是字节)
头文件: memory.h 或 string.h
strcpy()只能复制字符串, memcpy()什么类型的数据都可以进行复制
#include
int 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 , 单位是字节
}
2.
memmove(); //内存单元复制 (可以自己给自己追加)
void * memmove ( void * dest, const void * src, size_t num ); //目标起始地址, 要复制内存单元起始地址 , 复制的数量(单位是字节)
#include
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 20);
//把arr1 的20个内存单元复制给 arr1+2 的位置 , 单位是字节
return 0;
}
//arr1 给 arr1自己进行了复制,并且重叠
//如果是上面 模拟实现memcpy 的方法,数据会被替换, 无法实现重叠,结果会是: 12121218910 //err
3.
memset(); //修改内存中的单元 , 单位是字节
void* memset( void* dest, int c, size_t count ); //目标起始地址, 修改内存单元的起始地址 , 修改的内存单元数量(单位是字节)
#include
int 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一样:
#include
#include
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,3,4,0x11223305 }; //小端存储,所以第17个字节是05
int ret = memcmp(arr1, arr2, 17); //所以对比17个字节都相等
printf( "%d\n", ret);
return 0;
}
但是如果比较的元素是18个的话, 就是不相等的, 这是对arr2的第18的内存单元33 进行和arr1的第18的内存单元00 进行比较,
结果返回小于0的值, 不同编译器下会不同, 当前返回的是-1
//如果是字符在内存中进行比较,比较的是它们相对应的ASCII码值,
//所以会出现 'A' < 'a' 这种情况,因为'A' 的ASCII码值是:65 而 'a' 的ASCII码值是:97