学习嵌入式Day9:C语言之函数
函数的难点是思想。需要自上而下,逐步拆解,由大问题拆分成小问题,再拆解成更小的问题,每个小问题都对应一个具体简单独立的功能。
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函数里的内容就精简很多。不过函数的使用也要注意规范,容易出现调用方式不正确的情况,实参不能写漏,写表达式时要关注函数的返回值类型。对于函数调用的本质,就是在栈中进行操作,它可以自动申请自动释放。函数虽然提高了编程的效率,但是我认为对逻辑的要求更高,需要多练习,锻炼自己的思维能力。
更多推荐



所有评论(0)