内存函数:memcpy/memmove/memcmp/memset

 memcpy


    //void* memcpy(void* destination, const void* source, size_t num);
        //void*可以接收任意类型的指针,运算或者解引用时必须先进行强制类型转换;destination是目标空间起始位置;source是源空间的起始位置;num的单位是字节
        //memcpy的返回值是目标空间的起始位置,即destination
        //即memcpy是将源空间的前num个字节拷贝到目标空间
    // memcpy是内存拷贝函数,内存不是字面意思,它指的是内存中存储的任意类型的数据
    // strcpy只能拷贝字符串,而memcpy可以拷贝任何类型的数据
    //(函数需要包含头文件<string.h>)
    //memcpy不适用于destination和source有内存重叠的情形,该情形专门由下一个讲到的mememove函数来处理

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 2,4,6,8,10 };
	memcpy(arr1, arr2, 20);	//20的单位是字节
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);	//2 4 6 8 10 6 7 8 9 10
	}
	return 0;
}

         模拟实现memcpy

 

void* my_memcpy(void* arr1, const void* arr2, size_t num)
{
	void* ret = arr1;
	while (num--)
	{
		*(char*)arr1 = *(char*)arr2;//强制类型转换只是在该语句中,该语句执行完又会恢复到原来的类型,即强制类型转换都是临时性的
		((char*)arr1)++;
		((char*)arr2)++;
	}
	return ret;
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 2,4,6,8,10 };
	my_memcpy(arr1, arr2, 20);	//20的单位是字节
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);	//2 4 6 8 10 6 7 8 9 10
	}
	return 0;
}

 

 memmove


    //相对于memcpy,memmove专门解决目标空间和源空间的内存重叠问题
    //(函数需要包含头文件<string.h>)

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr + , arr + 2, 240);
		//arr是数组名,表示数组首元素地址;arr + 4是数组第五个元素地址;arr + 2是数组第三个元素地址;20的单位是字节(即5个int类型数据)
		//arr + 4是目标空间的起始地址,arr + 2是源空间的起始地址,即从arr + 2的位置开始向后复制20个字节(5个int型)的数据到以arr + 4为起始地址的目标空间
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);	//1 2 3 4 3 4 5 6 7 10
	}
	return 0;
}

         模拟实现memmove


    //如果源空间和目标空间出现重叠:当目标空间的起始位置大于源空间的起始位置(即目标空间起始位置相对于源空间起始位置而言是较高地址)时,源空间内存储的数据从高地址向低地址的顺序依次拷贝到目标空间;其他情况均是从低地址向高地址的顺序依次拷贝

void* my_memmove(void* arr1, const void* arr2, size_t num)
{
	void* ret = arr1;
	if (arr1 <= arr2)
	{
		while (num--)
		{
			*(char*)arr1 = *(char*)arr2;
			((char*)arr1)++;
			((char*)arr2)++;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)arr1 + num) = *((char*)arr2 + num);
		}
	}
	return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 4, arr + 2, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);	//1 2 3 4 3 4 5 6 7 10
	}
	return 0;
}

 

 memcmp


    //int memcmp(const void* ptr1, const void* ptr2, size_t num)    注意:这里的num单位是字节
    //memcmp是比较从ptr1和ptr2指针开始的前num个字节
    //memcmp和strcmp的区别是可以对任意类型的数据进行比较,其他无异

int main()
{
	char arr1[] = "abcddef";
	char arr2[] = "abcdefg";
	int p1 = memcmp(arr1, arr2, 4);
	int p2 = memcmp(arr1, arr2, 5);
	printf("%d\n", p1);		//0
	printf("%d\n", p2);		//-1
	return 0;
}

 

memset


    //void* memset(void* ptr, int value, size_t num)
    //memset是将ptr指向的内容的前num个字节的值设置成value    注意:num单位是字节        memset的返回值是ptr 

int main()
{
	char str[] = "hello world";
	int arr[10] = { 0 };
	memset(str, 'a', 5);
	memset(arr, 1, 10);
	printf("%s\n", str);	//aaaaa world
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);	//16843009 16843009 257 0 0 0 0 0 0 0
			//memset不能实现将arr的所有元素设置成1,主要原因还是memset中的参数num的单位是字节,它是按字节来设置的
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/libj2023/article/details/131692587
今日推荐