函数
目标
· 熟练掌握函数的结构
· 熟练掌握函数声明和原型
· 熟练掌握函数的调用
· 理解函数的嵌套调用和递归调用
· 熟练掌握按值传递
· 掌握变量的作用域和存储类型
· 理解函数的作用域
函数的参数
· 函数的参数分为形参和实参两种,作用是实现数据传送。
· 形参出现在函数定义中,只能在该函数体内使用。发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送。
· 其它说明:
· 实参可以是常量、变量、
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式、函数等。
· 形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。
· 实参和形参占用不同的内存单元,即使同名也互不影响。
从函数返回
· 将控制权从函数传回主调程序
· 把 return 语句中的内容返回给主调程序
函数的数据类型
· 在定义函数时,对函数类型的说明,应与return语句中、返回值表达式的类型一致。
· 如果返回的是一个整型值或者没有返回值,可以省略类型标识符
· 为了避免出现不一致,最好指定数据类型
int squarer(int x)
/* int x; */
{
int j;
j = x * x;
return(j);
}
函数原型和函数声明
· 在定义之前使用函数,必须声明,否则,一些编译器会返回错误
· 采用函数原型方式,对被调用函数进行说明,其一般
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
如下:
· 函数类型 函数名(数据类型[ 参数名][, 数据类型[ 参数名2]…]);
调用函数
· 函数调用的一般形式为:函数名([实际参数表]);
· 调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。
· 实参在个数、类型和顺序与被调用函数的形参,必须一一对应和匹配。如果类型不匹配,C编译程序将按赋值兼容的规则进行转换。
函数调用的嵌套
· 函数的嵌套调用是指,在执行被调用函数时,被调用函数又调用了其它函数
f2(){…}
f1(){
f2();
…//后续语句
}
main()
{
f1();
…//后续语句
}
函数的递归调用
· 一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。
· 间接递归
· 为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的
办法
鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载
是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。
利用递归求阶乘
#include
int factorial( int );
int main() {
int i;
for ( i = 1; i <= 10; i++ )
printf(“i=%d factorial: %d\n”,i, factorial(i));
return 0;
}
int factorial( int number ) {
if ( number <= 1 )
return 1;
else
return (number*factorial(number-1));
}
变量
· 局部变量
· 在函数内部声明
· 进入一个程序块时创建,退出该程序块时销毁
· 形式参数
· 在函数定义中被声明为参数
· 在函数内部像局部变量一样使用
· 全局变量
· 在所有函数以外声明
· 在程序的整个执行期间都拥有值
存储类别3-1
· 存储类别是数据在内存中的存储形式,是变量的属性,使用的一般语法:
· 存储类别 数据类型 变量名称;
· 例如:
auto int a;
static int b;
·
register int c;
· 存储类别定义了:
· 生命周期:保留特定值的时间长度
· 可见性:程序的哪些部分将能够“看见”该变量
存储类别3-2
· 自动的(auto)
· 外部的(extern)
· 静态的(static)
· 寄存器的(register)
存储类别 3-3
· 内存中的存储区域包括下面几个部分:
· 程序代码区:存放函数体的二进制代码
· 静态区/全局区(static):全局变量和静态变量的存储 区域
· 堆区(heap):程序员分配释放
· 栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值
· 文字常量区:存放字符串常量
静态的局部变量
· static局部变量的作用域与auto变量相同
· static局部变量的生存期与全局变量相同
#include
void Add(){
static int i=10; //初始化工作在编译时进行,且只进行一次
i++;
printf(“i=%d\n”,i);
}
void main() {
Add();
Add();
}
参数传递
· 调用一个函数时,调用函数和被调用函数之间会发生数据传递,有两种数据传递方式。
· 按值传递
· 按地址传递
按值传递
· 变量的值被传递给被调函数,并且对这个值的任何改变都不会影响被传变量的原值
· 默认情况下,函数参数都是按值传递的
· 参数值是通过临时变量传递的
· 所有操作都针对这些临时变量
数据传递的几种方式
· 主调函数与被调函数进行数据传递的方式有以下几种:
· 参数传递
· 返回值
· 全局变量:
· 使用全局变量不符合程序设计中要求模块间“强内聚性、弱偶合性”的原则。使这些函数依赖这些全局变量,因而使得这些函数的独立性降低。
· 使用全局变量过多,会降低程序的可读性和可维护性。
多文件程序中的函数
· 函数可以定义成静态的或者外部的
· 静态函数只能在其程序文件内部被识别
static fn _type fn_name (argument list);
· 外部函数可以被程序的所有文件识别
extern fn_type fn_name (argument list);
四种作用域
· 全局作用域
· 文件作用域
· 函数作用域
· 块作用域
全局作用域
· 在一个程序文件的所有函数定义之外(并且通常在所有函数定义之前)定义的标识符,则该标识符具有全局作用域,即该标识符在整个程序包括的所有文件中都有效,都是可见的,都是可以访问的。
· extern全局变量, extern函数
文件作用域
· 在函数外面定义的标识符,能够被从标识符说明到文件结束之间的所有函数引用
· static全局变量、static函数定义或函数原型
函数作用域
· 只能在函数体中引用
· 标签号(goto)是唯一具有函数作用域的标识符
· 一块代码是否有权访问另一块代码或数据
· 函数内部的代码对该函数来说是私有或局部的
· 两个函数拥有不同的作用域但处于相同的级别
· 函数不能在其他函数以内定义(不能嵌套定义)
块作用域
· 在程序块中声明的标识符具有块作用域
· 块作用域开始于声明处,结束于程序块的右花括号
· 函数的形式参数、函数的局部变量、在复合语句中声明的变量具有块作用域
· 如果外层块和内层块有相同名字的变量,外层说明会被内层说明屏蔽(最近嵌套原则)总结
· 函数的结构、声明、定义和调用
· 参数按值传递
· 函数的作用域
· 变量的存储类别