C-内存函数(大量图解,函数实现)

4 篇文章 0 订阅
2 篇文章 0 订阅

目录

一.memcpy

二.memmove

三.memcmp

四.memset


一.memcpy

头文件:

#include<string.h>

函数原型: 

功能解析:

  • 目的地址和源头地址,类型是void*可以接收任意类型
  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 '\0' 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的(在VS2022中,是不会出现重叠的

 函数模拟实现:

在实现函数前我们需要测试一下,几种常见的异常情况:

1.拷贝0字符

2.传入空指针

 我们再来看这个代码正常运行情况:

程序居然没有崩溃什么都没有发生

3.拷贝数传入负数

小数就不用多说了,类型都完全不同 

实现: 

  异常判断

void* my_memcpy(void* dest, const void* src, size_t num)
{	
	//异常判断

	if ((dest == NULL) || (src == NULL))
	{
		perror("my_memcpy");
		return NULL;//结束函数
	}
	if (num == 0)//如果拷贝0个直接返回目的地地址,就不用浪费时间了
	{
		return dest;
	}
}

 模拟实现:

void* my_memcpy(void* dest, const void* src, size_t num)
{	
	//异常判断
	if ((dest == NULL) || (src == NULL))
	{
		perror("my_memcpy");
		return NULL;
	}
	if (num == 0)
	{
		return dest;
	}
	//正常拷贝
	void* str = dest;
	while (num--)
	{
		*(char*)str = *(char*)src;
		src = (char*)src + 1;
		str = (char*)str + 1;
	}

	return dest;
}

运行结果: 

补充:!!! 

这个时候可能就有朋友会说,啊!你负数都没有处理,我也想过去处理发现各种方式都不行,后来才知道,有的时候就不用去处理,库里面的函数num是siz_t类型,你要传负数可以,那他就会变成一个很大的数,大不了就是栈溢出,栈溢出是你使用函数不当,我函数没有问题

还有一种情况,重合的空间:

1.前到后地址

 

 2.后到前地址

 我们得出结论:

  • 从前(低地址) -> 后(高地址)反方向拷贝
  • 从后(高地址) -> 前(低地址)从前拷贝

在C语言中用memmove函数就可以实现

二.memmove

函数头文件:

#include<string.h>

函数原型:

  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理

 模拟实现:

void* my_memmove(void* dest, const void* src, size_t num)
{
	//异常判断
	if ((dest == NULL) || (src == NULL))
	{
		perror("my_memcpy");
		return NULL;
	}
	if (num == 0)
	{
		return dest;
	}
	//正常拷贝
	void* str = dest;
	if (str < src)
	{
		while (num--)
		{
			*(char*)str = *(char*)src;
			src = (char*)src + 1;
			str = (char*)str + 1;
		}

	}
	else
	{
		while (num--)
		{
			*((char*)str + num) = *((char*)src + num);
		}
	}

	return dest;
}

代码段解析:

 代码结果: 

memmove:

memcpy:

但是在vs2022中memcpy也是可以完成重叠空间的拷贝的,这就得取决于编译器了

三.memcmp

函数头文件:

#include<string.h>

函数原型:

 返回值解析:

函数细节:

1.他是一个一个字节比较的,两个地址的字节相同,就比较下一个字节,一直比较到不同的,根据规定返回,或者到末尾返回0

函数实现准备:

老样子先去测试一下常见的一些意外情况

1.空指针

2.

3.num传入0

 4.num传入负数和上面的memcpy不处理就好

模拟实现:

1.意外判断

int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
    //异常判断
	if ((ptr1 == NULL) || (ptr2 == NULL))
	{
		perror("my_memcmp:");
		return NULL;//结束函数
	}
	if (num == 0)
	{
		return -1;
	}
}

2. 正确实现

int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
	//意外判断
	if ((ptr1 == NULL) || (ptr2 == NULL))
	{
		perror("my_memcmp:");
		return NULL;//结束函数
	}
	if (num == 0)//如果没有这个if下面的返回值任然会计算
	{
		return -1;
	}
	//正常运转
	const char* str1 = (const char*)ptr1;
	const char* str2 = (const char*)ptr2;
	while ((*str1 == *str2) && (num > 0))//不大于0为假
	{
		str1++;
		str2++;
		num--;
	}
	
	if (*str1 - *str2 > 0) 
		return 1;
	else if (*str1 == *str2) 
		return 0;
	return -1;

	//也可以直接 return (*str1 - *str2);
}

运行结果:

 各种情况都是正确的


四.memset

头文件:

#include<string.h>

函数原型:

 函数使用:

1.

2.

 3.

制作不易,你们的支持是作者最大的动力!!!

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
### 回答1: 《三角函数全公式及图解简明解推导.pdf》是一份介绍三角函数全公式的讲解文件。三角函数是数学中非常重要的概念,常用来描述角度与边长之间的关系。这份文件通过图解和简明的解释,向读者展示了三角函数的全公式,并推导了其来历和性质。 首先,在文件中介绍了正弦、余弦和正切函数的定义以及它们与直角三角形的关系。通过使用一个单位圆来说明,正弦函数与角度的关系如何通过圆上的弦得到,余弦函数与角度的关系如何通过圆上的标准化纵坐标得到,正切函数与角度的关系如何通过圆上点的横纵坐标比值得到。 其次,文件通过一系列的图解,给出了三角函数全公式的解释和推导过程。例如,文件展示了三角函数的和差公式、倍角公式、半角公式等,并且使用图像来直观地解释这些公式的几何意义。这些公式不仅可以帮助我们计算三角函数的值,还可以用来简化三角方程的求解过程。 此外,文件还详细介绍了三角函数的周期性和对称性,通过图像和公式的对比,展示了这些性质的重要性。 通过阅读《三角函数全公式及图解简明解推导.pdf》,读者可以全面了解三角函数的性质和全公式的推导过程,对于学习和应用三角函数具有极大的帮助。这份文件使用简明的语言图解进行讲解,使得读者更容易理解和掌握三角函数的概念和应用。相信通过学习这份文件,读者可以更加深入地理解三角函数,并且能够运用到实际问题中去。 ### 回答2: 《三角函数全公式及图解简明解推导.pdf》是一份论述三角函数全公式的文件。三角函数是数学中重要的概念,可以描述角和边之间的关系。全公式是指正弦、余弦和正切三种三角函数之间的关系表达式。 这份文件通过图解和推导的方式来解释三角函数全公式。首先,它通过图示角度和三角函数的关系,帮助读者理解三角函数的基本定义。然后,文件引入了垂线和斜边的概念,解释了正弦、余弦和正切的定义,并将其与角度联系起来。 接下来,文件推导了三角函数全公式。通过利用单位圆上的点和角的关系,文件推导了正弦、余弦和正切的全公式。全公式包括各种不同的表示形式,如正弦差、余弦差、边角关系等,使读者能够根据具体情况选择最适合的公式。 通过图解和推导,这份文件使得三角函数全公式易于理解和记忆。它为读者提供了一个全面了解三角函数的基础,并为他们应用三角函数解决实际问题奠定了基础。 总之,这份文件是一份介绍三角函数全公式的有益资源。通过图解和推导,它帮助读者理解三角函数的概念和全公式的推导过程,并为读者提供了一个应用三角函数的基础。对于学习三角函数的人来说,这份文件是一个重要的参考资料。 ### 回答3: 《三角函数全公式及图解简明解推导.pdf》是一份介绍三角函数全公式及图解推导的文档。三角函数是数学中的重要概念,广泛应用于几何、物理、工程等领域。这份文档通过图文结合的方式,详细解释了三角函数的各类公式以及推导过程。 文档中首先介绍了三角函数的基本概念,包括正弦、余弦、正切等。然后,详细推导了正弦、余弦、正切的和差公式、倍角公式、半角公式等。通过推导过程,读者可以清晰地了解这些公式是如何得出的,从而更好地理解和应用它们。同时,文档还介绍了三角函数的周期性和对称性,以及三角函数的周期、幅值等概念,为读者提供了更全面的知识。 为了更好地帮助读者理解三角函数的概念和公式,文档中使用了大量图解。通过图示,读者可以看到三角函数图像的变化规律,直观地理解角度对应函数值的关系。这种图解方式对于初学者来说非常友好,能够帮助他们更好地理解和记忆三角函数的概念和公式。 总结来说,《三角函数全公式及图解简明解推导.pdf》是一份内容详实、形式生动的三角函数教学材料。通过阅读这份文档,读者可以系统地学习和掌握三角函数的各类公式,并通过图解形式更好地理解和应用这些公式。无论是初学者还是进阶学习者,都可以从这份文档中受益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值