函数的难点是思想。需要自上而下,逐步拆解,由大问题拆分成小问题,再拆解成更小的问题,每个小问题都对应一个具体简单独立的功能。

C语言提供了实现功能的语法:

一个函数就是完成一个功能,且功能独立单一。

一、函数定义

函数模型:输入——处理——输出

1.语法

类型标识符 函数名(形式参数)

{

        函数体

        //声明部分;

        //语句部分;

}

1.类型标识符:数据类型,不能是数组类型。反映的是函数带出来的结果的类型。

2.函数名:标识符,命名规则和变量名命名规则一样。反映函数功能。

3.形式参数:表示函数要处理的数据。(数据来源是实参,即实际给到的数据)

4.函数体:完成函数功能的代码。(声明部分和语句部分)

2.定义函数步骤

step1.先确定函数名,能够表示函数的功能

step2.从函数模型角度考虑要处理数据的个数和数据类型

形式参数语法:(数据类型 形参变量名1,数据类型 形参变量名2 …)

每个形式参数变量,都要说明类型。

step3.处理数据,写函数核心功能代码

step4.确定返回值的类型

例:
int sum(int a, int b)
{
    int result = a + b;
    return result;
}

二、函数调用

1.语法

函数名(实际参数);

sum(1,2);

函数调用方式:

函数调用语句、函数调用表达式、作函数调用的实参

2.函数的好处

1.降低重复代码的编写,提高编程效率;

2.实现了程序的模块化,提高程序的可靠性和可维护性。

注意:

1.实参和形参

每个形参变量,都要说明类型

实参和形参做到个数相同、类型匹配

2.返回值类型默认是int类型

3.返回值类型与返回结果类型不一样时,以返回值类型为准

4.函数定义的位置可以放在main函数之前也可以放在main函数之后

之前:同时定义和声明

之后:再使用函数之前,要做声明(把函数头复制一份在main之前)

5.如果函数不需要传入数据,此时形参设置为void(空指针);返回值没有也要设置成void,此时可以有return,但是return后面不要有内容

 void  printMenu(void)
   {
	   printf("----MP3-----\n");
	   printf("Play\n");
	   printf("Next\n");
	   
	   return ; //如果返回值类型为void,return后面什么值都不要写
   }  

6.main函数称为程序的入口

7.函数可以实现嵌套调用

8.所有程序的运行,都在内存上运行

3.递归

函数嵌套调用:自己调用自己——递归

直接递归

void func1(void)
{
	func1();
}

间接递归

void func2(void)
{
	func1();
}

1.递归是一种特殊的循环

2.for、while、do…while 效率更高,但有些问题的解决,用递归的方式更容易实现

3.递归解决问题的思路:

倒着思考,解决问题n,要看问题n-1能否解决,它们有什么递推关系。

实现递归:

n和n-1之间的递推关系;递归结束条件;递归的深度不要太深,否则可能栈空间不够,导致段错误。

for (i = 0; i <= 100; ++i)
{
	sum = sum + i;
}	
//n和n-1的递推关系
sum(100)
  |---sum(99)+100
       |---sum(98)+99
	        |---sum(97)+98
			      |---sum(96)+97
                          |---
						   ....
						       sum(3)+4
							      |---sum(2)+3
								        |---sum(1)+2
										      |---1
   
   
sum(n) = sum(n-1) + n
//递归实现1+2+3+…+n
int sum(int n)
{
	//if(递归结束条件)
	//{
	// 返回
	//}else
	//{
	// 继续递归下去 ---sum
	//}
	if (n==1)
	{
		return 1;
	}else
	{
		return sum(n-1) + n;
	}
}

三、栈和堆区

栈(本身是一块内存空间):

特点:先进后出FILO

局部变量都放在栈上,栈上变量自动申请、自动释放。

Linux栈空间默认8M,可以修改。

堆区:

特点:特别大,需要手动申请、手动释放

32位系统 4G 操作系统大概占1G

四、总结

今天主要学习了函数,了解了函数的定义和他的特点,接着和前几天学习的简单算法结合起来,完成不同功能函数的编写和调用,有了函数,main函数里的内容就精简很多。不过函数的使用也要注意规范,容易出现调用方式不正确的情况,实参不能写漏,写表达式时要关注函数的返回值类型。对于函数调用的本质,就是在栈中进行操作,它可以自动申请自动释放。函数虽然提高了编程的效率,但是我认为对逻辑的要求更高,需要多练习,锻炼自己的思维能力。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐