数据结构函数
静态存储方式
程序运行期间分配固定的存储空间 全局变量全部存放在静态存储区中
C语言程序设计 - 第5章 函数
30
变量的存储类型
自动变量 寄存器变量 静态变量 外部变量
auto register static extern
C语言程序设计 - 第5章 函数
31
自动(auto)变量
C语言程序设计 - 第5章 函数 15
函数声明举例 (1)
void main() { int max(int x, int y); /* 函数声明 */ int a, b, c; c = max(a, b); } int max(int x, int y) { return x>y?x:y; }
C语言程序设计 - 第5章 函数 16
/* 引用局部变量a */ }
全局变量 a,b,x,y 作用域
全局变量 c作用域 局部变量 a作用域
C语言程序设计 - 第5章 函数
29
动态存储方式和静态存储方式
动态存储方式
程序运行期间根据需要动态分配存储空间 函数形参、自动变量等
每次调用函数时,给该函数中的局部变量和
形参分配存储空间,函数返回后释放空间
寄存器(register)变量
register变量
存放在CPU寄存器中,存取速度快 寄存器变量只能动态分配存储空间(寄存器)
只有自动变量和形参可以作为寄存器变量
举例
int foo(int x) {
register int i; /* 定义寄存器变量i */ for(i=0; i<10000; i++)... /* i用于循环变量 */
24
局部变量 (Local Variables)
局部变量
函数或复合语句内部定义的变量
说明
作用域为本函数或复合语句范围
不同函数内的局部变量可以重名,它们是不
同的变量,作用域不同,不会相互干扰 函数形参也是局部变量的一种 若多个同名局部变量作用域重叠,则最内层 复合语句中定义的局部变量有效
C语言程序设计 - 第5章 函数 9
x
y
1 4
4 1
1
a
4
b
return语句
形式
形式一:return; 形式二:return
expression;
功能
函数返回语句 结束函数调用 如果需要,还可以带回函数返回值
C语言程序设计 - 第5章 函数
10
函数的返回值 (Return Value)
返回值的说明
函数返回值的类型在函数定义中指定
函数返回值通过函数中的return语句获得 若函数无返回值,则可以没有return语句
return语句后的表达式类型,应与函数返
回值类型相同,或可以兼容赋值;两者类型 不同时,自动做类型转换 函数需要返回值时,若缺少return语句, 或return语句未带返回值,则返回一个不 确定值
a,b,i 作用域
C语言程序设计 - 第5章 函数
27
全局变量 (Global Variables)
全局变量(外部变量)
函数之外定义的变量
说明
作用域从变量定义处到本源程序文件结束
全局变量可以被本文件的函数所共用 增加函数间传递数据的渠道 若全局变量与局部变量重名,则局部变量在
函数原型 (Prototype)
一般形式
类型
函数名(类型1, 类型2, ...); 类型 函数名(类型1 形参1, 类型2 形参2, ...);
举例
int
max(int, int); int max(int x, int y); void dummy(); /* 无参函数原型 */ void dummy(void); /* 同上 */
函数调用的应用
函数语句
printf("%d\n",
i);
函数表达式
(c
+ d * max(a,b)) % e min(c, d))
函数参数
gcd(max(a,b),
说明
函数调用可以看作同返回类型的表达式使用
同时,函数调用还完成了函数中定义的操作
C语言程序设计 - 第5章 函数 13
C语言程序设计 - 第5章 函数 5
函数的调用、参数和返回值
函数的参数
形参和实参 参数传递
函数的返回值 函数的调用
函数调用的形式 函数的声明和函数原型 函数的嵌套调用和递归调用
C语言程序设计 - 第5章 函数
6
函数的参数 (Arguments)
形式参数和实际参数
形参:定义函数时,函数名后()中的参数 实参:调用函数时,函数名后()中的参数
C语言程序设计 - 第5章 函数 14
函数的声明 (Declaration)
函数声明的形式即函数原型 在函数调用之前,应对函数进行声明 函数声明可以在主调函数的声明部分, 也可以在函数外部 函数外部的声明,对所有主调函数都起 作用,不需要在主调函数内再次声明 函数的定义也具有声明的作用 库函数的声明包括在头文件(*.h)里,不 需在源程序里声明
实参可以是常量、变量、表达式、函数调用
实参和形参必须类型相同或赋值兼容
举例
max(int x, int y)/*函数定义*/ { return x>y?x:y; } max(a, 3); /*函数调用*/
int
C语言程序设计 - 第5章 函数 7
参数传递
值传递
实参对形参的数据传递是“值传递”
单向传递
只能把实参的值传递给形参 不能把形参的值传递给实参 对形参的值所作的改变不能带回给实参
实参和形参是不同的变量
具有不同的存储空间
具有不同的生存期和作用域
C语言程序设计 - 第5章 函数 8
参数传递举例 (05-01.C)
void swap(int x, int y) { int t; t=x, x=y, y=t; } void main() { int a=1, b=4; swap(a, b); }
关于“返回类型”
指函数返回值的类型 若省略此项,则认为返回类型是int
若无返回值,则定义返回类型为void
关于“参数声明”
类型
形参名, 类型 形参名, ...
关于“声明部分”
指变量、函数的声明
C语言程序设计 - 第5章 函数
4
函数定义举例
int max(int x, int y) { int z; z = x>y?x:y; return z; } int min(int x, int y) { return x<y?x:y; }
C语言程序设计 - 第5章 函数
22
例1:Hanoi塔
解法
N=1时,Hanoi(1)易解 若Hanoi(N-1)可解,则Hanoi(N)易解
Step1. N-1个盘子,借助3,从1移至2 Step2. 把最大的盘子从1移至3 Step3. N-1个盘子,借助1,从2移至3
复杂度
移动次数:2N-1
C语言程序设计 - 第5章 函数 17
函数声明举例 (3)
int max(int x, int y) /* 函数定义具有声明作用 */ { return x>y?x:y; } void main() { /* 不需要再次声明int max(int, int) */ int a, b, c; c = max(a, b);
C语言程序设计 - 第5章 函数 11
函数的调用
一般形式
函数名(实参表列)
说明
即使没有实参,()也不能省略
多个实参之间用逗号分隔 实参与形参按顺序一一对应,类型应匹配 实参的求值顺序不确定,应避免对此敏感的
调用形式 printf("%d,%d", i, i++);
C语言程序设计 - 第5章 函数 12
目 录
函数概述 函数定义的一般形式 函数的调用、参数和返回值 局部变量和全局变量 变量的存储类型 内部函数和外部函数
C语言程序设计 - 第5章 函数
1
函数 (Function)
C语言用函数实现程序模块化 一个程序由一个或多个源程序文件组成 一个源程序文件由一个或多个函数组成 C程序的执行从main函数开始,并回到 main函数结束 函数之间可以相互调用,或调用自身 不能调用main函数 函数之间相互独立,不存在从属关系
auto变量
局部变量,用auto关键字修饰 auto可以省略,是缺省的存储方式
自动分配和释放存储空间
举例
int foo(int x) {
auto int a, b, c=6; /* 定义自动变量a,b,c */ float f, g=0.1; /* 定义自动变量f,g */
}
C语言程序设计 - 第5章 函数 32
C语言程序设计 - 第5章 函数 2
函数定义的一般形式
函数定义形式
返回类型
函数名(参数声明)
{
声明部分 语句
}
返回类型、参数、函数体内容都可没有
dummy(){}