目录
memcpy函数的使用和模拟实现
https://legacy.cplusplus.com/reference/cstring/memcpy/
memcpy可以复制整数或浮点数
这个代码是将arr数组里的数值复制的a数组,那个40是字节,
int类型是4个字节那么要交换10个数值,4*10=40
cpp
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int a[99] = { 0 };
memcpy(a, arr, 40);
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
}
memcpy的模拟实现
强制类型转换char*一个字节一个字节的交换
memmove函数的使用和模拟实现
https://legacy.cplusplus.com/reference/cstring/memmove/
这个函数也是复制数值,但是可以在同一块空间重叠
我们可以看到下面这个代码,是从arr+3开始,arr复制到arr+3的位置上,复制20个字节,4*5=20
memmove模拟实现
数组的地址是连续存放的,地址由低到高
arr+3大于arr
来看看这一张图,当arr+3比arr大我们可以看到从前往后复制可能会覆盖掉复制过去的数值
arr从后往前复制,不会出现覆盖的情况
arr+3小于arr
这一张图,我们可以看到arr+3比arr小的话使用从后往前复制好像会覆盖掉复制过去的数值
当使用从前往后复制,就不会出现覆盖的情况
总结
我们可以使用arr+3来判断
如果arr+3小于arr使用从前往后复制
如果arr+3大于arr使用从后往前复制
代码
下面这代码用if来判断x<y就是arr+3小于arr使用从前往后复制
从前往后复制和memmcpy的模拟实现一样
arr+3大于arr使用从后往前复制x+sz就可以拿到后面的数值,y+sz也可以
拿到后面的数值然后2个进行交换,循环一次sz-1
cpp
// arr+3 arr 交换的字节
void* mn_memmove(void* x, void* y, size_t sz)
{
if (x < y)//arr+3小于arr,从前往后复制
{
while (sz--)
{
*(char*)x = *(char*)y;
x = (char*)x + 1;
y = (char*)y + 1;
}
}
else//arr+3大于arr,从后往前复制
{
while (sz--)
{
*((char*)x + sz) = *((char*)y + sz);
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
mn_memmove(arr + 3, arr, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
}
memmset函数的使用
https://legacy.cplusplus.com/reference/cstring/memmset/
memset可以将内存中的值以字节为单位设置成想要的内容
我们要就fang改成xxxx,
memmset第一个参数是从那个字节开始改,arr+6,下标就是 f 的下标。
第2个参数是要改的内容
第3个参数是要改多少个字节
memcmp函数
https://legacy.cplusplus.com/reference/cstring/memcmp/
memcmp是比较内存的,可以比较字符串,浮点数,整行
小于就返回小于0的数字
大于就返回大于0的数字
等于就返回0
在比较的时候是这样比的,如果再多比一个那么就会比较到04和07
04小于07返回-1