1.内存函数
1.11 memcpy
作用:将source指向的前num个数据拷贝到destination中去
参数类型是 void* 能够接收不同类型的数据
使用方法:
模拟实现:
需要注意返回值和函数接收参数的限制
但如果用 memcpy来拷贝重叠的空间中的内容,那么得到的结果是错误的
这时就需要用到memmove了
模拟实现
拷贝有重叠的空间中的内容,如果被拷贝内容在拷贝内容之后(将后面的内容拷贝到前面),即dest>src,需要从后往前拷贝;
如果被拷贝内容在拷贝内容之前(将前面的内容拷贝到后面),即dest<src,需要从前面开始拷贝;
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
assert(dest&&src);
void* ret = dest;
//返回值为目标数据的地址,提前将它保存下来
//判断dest和src那个在前面
if (dest > src)
//从后->前拷贝
{
while (num--)
{
//两个数组从末尾元素开始交换
*((char*)dest + num) = *((char*)src + num);
}
return ret;
}
else
//从前->后拷贝
{
while (num--)
{
//两个数组从头开始交换,交换一次过后往后移动一位(char*)
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
//num的单位是字节,一次也交换一个字节,当num减为0,交换停止
while (num--)
{
//将dest和src转换成char*类型逐字节交换,能够实现对各种数据类型的兼容
*(char*)dest = *(char*)src;
//强制转换指针类型是一个临时的过程,强转的结果是char*,但dest本身的类型不发生变化,再次使用需要重新转换
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//float
my_memcpy(arr1+2, arr1, 20);//将arr1开始的5个整型(20个字节)拷贝到arr1+2去
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
注意
1.13
逐字节比较,比较结果相等返回0,ptr1<ptrr2返回<0的数字,ptr1>ptr2返回>0的数字。
memset
将ptr指针开始的num个字节设置成给定的value值