Day_15 > 内存相关的函数

目录

1.memcpy

1.1memcpy函数的使用

1.2memcpy函数的模拟实现

2.memmove

2.1memcpy存在的局限性

2.2memmove函数的使用

2.3memmove函数的模拟实现

3.memset

3.1memset函数的使用

4.memcmp

4.1memcpy函数的使用


之前我们可能了解过字符串函数,今天我们了解一下内存相关的函数

1.memcpy

1.1memcpy函数的使用

strcpy函数我们可能都知道,字符串拷贝函数,跟函数名一样,只能拷贝字符串

但是我们知道,内存中的数据不仅仅是字符

int arr1[10] = { 0 };
int arr2[] = { 1,2,3,4,5 };

比如,当我们有这么一段数据

我们需要把arr2中的前五个整型的数据拷贝放在arr1中 

这个时候我们就不能使用strcpy,因为他是整型数据了

这时候我们C语言就提供了memcpy函数,同样的,我们在Reference - C++ Reference (cplusplus.com)上学习一下该函数

Day_15 > 内存相关的函数_第1张图片

void * memcpy ( void * destination, const void * source, size_t num );

 我们可以理解为,把source中的前num个字节的数据拷贝放到destination中去

我们还是用监视窗口来看一下数据是否被拷贝

Day_15 > 内存相关的函数_第2张图片

Day_15 > 内存相关的函数_第3张图片我们可以看到确实是被拷贝过去了 

1.2memcpy函数的模拟实现

void* my_memcpy(const void* dest, const void* src, size_t sz)
{
	assert(dest && src);
	while (sz--)
	{
		*(char*)dest = *(char*)src;
		dest=(char*)dest+1;
		src=(char*)src+1;
	}
}

运行的结果也是同样的效果

Day_15 > 内存相关的函数_第4张图片

Day_15 > 内存相关的函数_第5张图片

这里我们要注意

void*是不能直接++和--的,所以我们需要强转为char*类型,++或--跳过一个字节的空间

void*是不能直接解引用的,所以我们需要强转为char*类型,解引用

2.memmove

2.1memcpy存在的局限性

我们这个代码也是存在一定的局限性,比如下面这种情况

Day_15 > 内存相关的函数_第6张图片

将数组arr的前五个数据拷贝到arr[2]的位置,通过调试我们发现写出来的函数并不能有效的实现

Day_15 > 内存相关的函数_第7张图片

Day_15 > 内存相关的函数_第8张图片

C语言的标准规定:

不重叠内存的拷贝,可以使用memcpy,重叠内存的拷贝就不能使用了

重叠内存的拷贝,我们可以使用memmove函数来实现 

2.2memmove函数的使用

同样的,我们来先学习一下memmove函数的使用

Day_15 > 内存相关的函数_第9张图片

void * memmove ( void * destination, const void * source, size_t num );

他的参数和返回类型和memcpy一模一样,

我们尝试使用一下memmove函数,看能否解决刚才的问题

Day_15 > 内存相关的函数_第10张图片

Day_15 > 内存相关的函数_第11张图片

这样问题就很好的解决了 

2.3memmove函数的模拟实现

#include 
#include
#include
void* my_memmove(const void* dest, const void* src, size_t sz)
{
	void* ret = dest;
	assert(dest && src);
	if (dest < src)
	{
		//前->后
		for(int i=0;i前
		while (sz--)
		{
			*((char*)dest + sz) = *((char*)src+sz);
			/*dest = (char*)dest - 1;
			src = (char*)src - 1;*/
		}
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1+2, arr1, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	my_memmove(arr2 , arr2+2, 20);
	for (int j = 0; j < 10; j++)
	{
		printf("%d ", arr2[j]);
	}
	return 0;
}

 这样我们的代码就能实现memmove的效果了

Day_15 > 内存相关的函数_第12张图片

3.memset

3.1memset函数的使用

Day_15 > 内存相关的函数_第13张图片

void * memset ( void * ptr, int value, size_t num );

memset函数是以字节为单位设置内存的函数 

将 ptr 指向的内存块第1个字节(num)设置为指定(value)

举个例子

Day_15 > 内存相关的函数_第14张图片

Day_15 > 内存相关的函数_第15张图片

4.memcmp

4.1memcpy函数的使用

Day_15 > 内存相关的函数_第16张图片

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

memcmp函数作用是比较ptr1和ptr2指向的内存空间的前num个字节的数据

  • 如果相同则返回0
  • 如果ptr1指向内存的数据是小于ptr2指向内存的数据的,则返回小于0的数字
  • 否则返回大于0的数字

memcmp比较是以字节为单位比较的

举个例子

Day_15 > 内存相关的函数_第17张图片

Day_15 > 内存相关的函数_第18张图片Day_15 > 内存相关的函数_第19张图片

Day_15 > 内存相关的函数_第20张图片

 

你可能感兴趣的:(#,C语言进阶,算法)