常用的库函数总结

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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值