C语言基础学习——函数
函数定义:实现函数,就是把功能实现
函数调用:就是使用这个功能
计算机模型(函数功能类似):
输入----->处理----->输出
一、函数定义
类型标识符 函数名(形式参数) { 函数体 //声明部分,语句部分 }1.类型标识符:返回值类型说明符
这个类型说明符用来规定返回值的类型的
基本类型:整型、浮点型、字符型 //注意,数组类型不能用做函数返回值类型
注意:如果带出的结果类型和返回值类型说明符不一致,最终结果以返回值类型说明符为准
2.函数名:是标识符,用来表示是哪个函数
命名规则符合标识符命名规则
3.形式参数(形参):是函数获取数据的入口,函数要处理数据,可以通过形参获得
eg:y=x+2; x就类似于形式参数
实参和形参:
1.要求类型相同,个数匹配
2.实参和形参是一一对应的---位置对应
3.不需要形参
注意:如果函数不需要传入数据可以不写形参 //不写形参或者写成void
4.函数体:实现函数功能的代码
函数定义的位置
1.写在main函数前面
2.写在main函数后面 //写在后面需要提前声明函数
函数声明:复制函数头加上分号
二、函数实现
考虑:
1.功能是否独立单一
2.健壮性 //看后期维护是否简单
3.实用性
流程:
step1:先根据功能确定函数名
step2:从 输入----->处理----->输出 这个模型出发
1.函数需要输入什么---需要哪些数据,数据类型
形参的语法:
每个形参都必须指明类型和变量名
类型 变量名1,类型 变量名2,...
eg: int a,int b //注意不能写成int a,b
step3:处理数据(函数体)
eg:int r = a +b;
step4:考虑要不要带出结果
要带出结果---考虑返回值类型说明符--->带出结果的语句
eg:return 表达式;
不带出结果---返回值类型说明符 void(空类型)
eg:add函数
int add(int a,int b) { int ret = a + b; return ret; } //or void add(int a,int b) { int ret = a + b; printf("ret = %d\n",ret); }三、调用函数
语法:
函数名(实际参数);//实参实参和形参:
1.要求类型相同,个数匹配
2.实参和形参是一一对应的---位置对应
eg:add(1,2);
注意:函数调用的方式
add(); //函数调用语句
add()+3 //函数调用表达式
printf("%d",add(1,2)); //函数调用充当参数
嵌套调用:
eg:
isLeapYear() { } getDays() { isLeapYear(); }函数实现调用的本质:通过栈空间,进行现场保护和恢复
C语言中:
程序放到内存中
栈区:
特点:先进后出
平常定义的局部变量都是放在栈空间,局部变量的空间是自动申请,自动释放的
栈空间大小默认为8M
堆区:
特点:大
空间需要程序员手动申请,手动释放
一般数据量比较大的时候使用
全局区(静态区):全局变量
字符串常量区:“hello”
代码区:存放的就是程序代码指令
程序 = 数据+代码
函数的嵌套调用:
特殊的嵌套---递归//自己调用自己
直接递归:
f1(){ f1(); }间接递归:
f2() { f1(); } f1() { f2(); }递归是一种特殊的循环---调用自身实现循环
使用:有些时候使用循环很复杂,使用递归会简单
eg:累加
int sum(int n) { if(n == 1) { return 1; }else { return sum(i-1)+i; } }递归思路:倒着来
逻辑: 判断是否得到了递归结束的条件
是:返回结果
否:继续递推下去
注意:递归一次不要使用太多 //会发生段错误(栈空间使用完)
数组作函数参数;
int a[10];
1.数组元素做函数参数
a[0]
void printArray(int a[n])2.数组本身做函数参数
void printArray(int a[]) //形式上,可以写成数组形式形式上写成 int a[],本质上是int *a
int *a定位到数组的位置
要访问整个数组要在输入数组长度len
void printArray(int a[],int len) { int i; for(i = 0;i < len;i++) { printf("%d ",a[i]) } }形参:需要一个数组形式的参数,需要一个数组长度
实参:printArray(a,len); //数组名可以代表数组首元素地址