1.memcpy函数
void * memcpy ( void * destination, const void * source, size_t num )
memcpy函数:用于两个不相关的数组拷贝,函数结束,返回目标空间的起始地址。其中形参为两个地址:目标起始地址,数据起始地址,以及拷贝的字节数。
void* my_memcpy(void* dest, const void* stc, size_t num)
{
assert(dest && stc);//有解引用,断言
void* tmp = dest;
while (num--)
{
*(char*)dest = *(char*)stc;
dest = (char*)dest + 1;//void*类型无法运算,因此需要强转(强转都是临时的)运算,
stc = (char*)stc + 1;
}
return tmp;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20];
my_memcpy(arr2, arr1, 40);
for (int i = 0; i < 10; i++)
printf("%d ", arr2[i]);
return 0;
}
在此需要注意的一点是:形参地址都是void*类型,进行运算时,需要在进行强转类型(强转类型是一次性的临时的)
2.memmove函数
void * memmove ( void * destination, const void * source, size_t num )
memcpy函数只能用于不相关函数的拷贝,而memmove函数不仅能够适用于不相关函数,也适用相关函数的拷贝。它的形参和返回值与memcpy函数一样。
void* my_memmove(void* dest, const void* stc, size_t num)
{
assert(dest && stc);
void* ret = dest;
while (num--)
{
//目标在起点左边,从前向后拷贝
if (dest < stc)
{
*(char*)dest = *(char*)stc;
dest = (char*)dest + 1;
stc = (char*)stc + 1;
}
//目标在右边,从后往前拷贝
else
{
*((char*)dest + num) = *((char*)stc + num);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1, arr1+2, 20);
for (int i = 0; i < 10; i++)
printf("%d ", arr1[i]);
return 0;
}
3.memcmp函数
int memcmp ( const void * ptr1, const void * ptr2, size_t num )
memcmp函数:从内存角度比较两个数组的大小,形参为两个比较数组的首元素地址,以及所比较的字节个数。如果ptr1大于ptr2,则返回1,ptr1小于ptr2,返回-1,相等返回0.
4.memset函数
void * memset ( void * ptr, int value, size_t num )
memset函数:将数组中的元素以字节为单位进行更改,形参为需要修改的起始地址,修改后的数据以及所需要修改的字节数。返回值为ptr。