函数的意义
函数是一段程序,可以完成一个功能,例如:printf
提高程序的通用性,减少重复的代码(具有相似功能的代码)
实现模块化设计的基础
1.2函数的分类
main()函数,每个程序都必须要实现的,程序从main()函数开始执行,从main()函数结束
库函数:由系统已经实现的函数,例如:printf
自定义函数:用户自行设计并实现
1.3函数的使用
以math(数学库)为例,用man math.h查看库中函数
注意:必须有头文件:#include
例子1:pow()
函数功能:计算x的y次方,可使用man pow可查看pow()函数的使用方法
函数模型:double pow(double x,double y)
提供的信息:需要的参数,返回的结果的类型
使用函数的语法:函数名(参数列表)
实际情况
例子2:sqrt()
函数的功能:计算一个数的平方根
函数原型:double sqrt() //
提供的信息:需要提供一个double类型的参数
使用函数提供的参数可以是常量,变量,表达式
注意:使用数学库在编译时候必须使用 gcc select.c –lm
pow,sqrt为double型
补充:常见数学函数
1.4函数的执行过程
一旦程序中包含其他函数的调用(使用),执行到对应的函数调用的语句时,跳转到对应的函数执行,执行完毕后会返回调用的语句的下一条语句继续执行
具体实现过程:
1.5函数的定义
1.51函数的定义:函数的实现,需要我们设计函数对应的功能,参数,以及返回值
1.52定义的语法:
类型标识符 函数名(形式参数类型说明列表)
{
函数体
}
注:类型标识符:说明函数返回值的类型
函数名:符合命令规则即可,函数入口地址
形式参数说明列表:函数执行时需要提供的参数
函数体:具体的功能实现
():函数的标识
1.53设计过程:
(1)函数的原型设计:函数的名字,参数,返回值的类型确定
注意:需要将函数的原型设计写在调用(使用)之前,为了编译器对函数调用语句进行语法检查,
例如:int max(int x, int y);
注意:函数的声明处需要加分号
(2)函数的函数体的设计:函数的名字,参数,返回值类型的确定
函数具体功能的实现
注意:一个函数中,不能嵌套定义另外一个函数,
完整实例:
1.6函数的形式参数
表示函数所需要的参数
形式参数写在函数定义与声明中形式列表中
类型标识符 函数名(类型1 参数名1,类型2 参数名2…..)
每个形式参数都必须写参数名与类型
正确写法:int add(int x,int y)
错误写法:int add(int x,y)
形式参数一般每变量名
1.7函数的实际参数
表示函数提供的参数
实际参数是在函数调用时写在括号中的实际参数列表
函数名(实际参数1,实际参数2…..)
例如:add(3,4,5)
1.8值传递
将实际参数的值传递给形式参数
在传递值采用一一对应的方式
如:形参1=实参1 形参2=实参2….
只能将实际参数的值传递给形式参数,且只能单向传递
实际参数与形式参数之间,保持类型、个数、顺序一致
1.9无参函数
没有形式参数的函数,在形式参数类表中使用void表示(标准规范)
注意:调用时候,括号中不需要写void
实例:
1.10函数的返回值
如果一个函数需要返回运算结果,使用return关键字
return可以为变量或表达式或常量
函数允许没有return,正对没有返回值的函数,不能return一个值,函数执行完毕后,自动返回
例如:
注意:return的值原则上需要与声明的返回值的类型保持一致
如果没有返回值,就写void
补充:return的作用:1.返回一个值
终止函数的执行,立即返回
1.11注意及补充
1.变量的作用域:表示一个变量的作用范围
变量的生命周期:表示一个变量在内存中存在的时间
局部变量:一般定义在函数的内部(包括形式参数)
作用域:一般从定义的位置开始,到对应的{}结束
生命周期:从定义的位置开始,到超过作用域之后结束
从分配空间(定义时)到释放空间(超过作用域)的时间
全局变量:定义在函数外部
作用域:从定义的位置开始,到整个源文件结束
生命周期:从定义的位置开始,到整个程序执行结束
补充:程序加载到内存中之后,将数据分不同的类型分开存储,不同的区域存储不同的类型
栈区:存储局部变量
数据区:存储静态变量(使用static int a)
作用:以提高局部变量的生命周期(从定义的位置开始,一直到函数执行结束)但是没有改变作用域,且只会初始化一次,对应的值一直存在
注意:函数的形式参数属于局部变量,不同函数的形式参数即使同名,在内存空间中是不同的
不同函数中使用相同名字的局部变量,在内存中同样拥有不同的存储空间
形式参数不会影响实际参数
局部变量,静态变量,全局变量都是根据作用域,生命周期来进行区分
自动变量(auto),静态变量(static)根据存储区域来进行区分
默认情况变量的存储类型为auto,属于自动局部变量,超过作用域,生命周期就结束
√符号常量:在c语言中使用#define关键字来定义,提高程序的通用性
使用:#define 符号标识名 常量值(表达式)
#define SIZE 5
原理:在预编译阶段进行符号标识的替换,将程序所有引用的符号表示替换成后面的值
流程:源程序(test.c)--预编译(处理预处理命令,以#开头)---编译(c—cpu指令)---汇编---链接(test.0,ptintf.o)--可执行文件
2. goto 语句:跳转到指定的标识符去执行
例子:
3.技巧性:在ubuntu中ctrl+v进行选中后,按=可对齐所选行列
4.应用性:计算二维数组的行列和时,可使用以下方法
5. bool 类型:在c语言中用于表示真和假的类型,在内存中的值为 1 和 0
使用 true(1) 与 false(0)表示
使用方法:
① 定义头文件:#include
② 使用函数:
6技巧性:用于显示重复的数字,字母等时,要灵活使用数组下标
具体案例: