C语言 8函数
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例
交换两个数
调用前: x: x: 调用: a: swap: x: a: 7 7 11 temp 调用结束: x: 7 y: 11 b: y: b: 11 11 7 7 7 y: y: 11 11
#include <stdio.h> void swap(int a,int b); main() { int x=7,y=11; printf("x=%d,\ty=%d\n",x,y); printf("swapped:\n"); swap(x,y); printf("x=%d,\ty=%d\n",x,y); } void swap(int a,int b) { int temp; temp=a; a=b; b=temp; }
地址传递
–方式:函数调用时,将数据的存储地址作为参数传递给形参 方式:函数调用时,将数据的存储地址作为参数传递给形参 方式 存储地址 –特点: 特点: 特点 同样的存储单元 形参与实参占用同样的存储单元 形参与实参占用同样 "双向"传递 双向" 实参和形参必须是地址常量和变量 实参和形参必须是地址 地址常量和变量
(x, y, z) 4, 60, 1
/*函数 函数max的定义 的定义*/ 函数 的定义 int max(int x,int y,int z) { int max=x; if (y>max) max = y; 3 if (z>max) max= z; return max; }
1来自百度文库
4
8.4 函数参数及其传递方式
形参与实参 形式参数: 形式参数:定义函数时函数名后面括号中的变量名 实际参数: 实际参数:调用函数时函数名后面括号中的表达式 说明: 说明:
main() c=max(a,b); (main 函数) { int a,b,c; 实参必须有确定的值 实参必须有确定的值 实参必须有 scanf("%d,%d",&a,&b); max(int x, int y) (max 函数) 形参必须指定类型 形参必须指定类型 { int z; c=max(a,b); 实参 形参与实参类型一致,个数相同,按顺序一一对应. 形参与实参类型一致 形参与实参类型一致,个数相同,按顺序一一对应. z=x>y?x:y; printf("Max is %d",c);} return(z); 若形参与实参类型不一致,自动x, int y) 若形参与实参类型不一致, 按形参类型转换 若形参与实参类型不一致 自动按形参类型转换 形参 max(int 按形参类型转换——— } 函数调用转换 { int z; 形参在函数被调用前不占内存;函数调用时为形参分配 形参在函数被调用前不占内存; 形参在函数被调用前不占内存 z=x>y?x:y; 内存;调用结束, 内存;调用结束,内存释放 return(z);}
例
函数说明举例
main() add(float x, float y) main() float floatfloat add(float,float); /*function declaration*/ { { { float z;a,b; floatint c; a,b,c; z=x+y; scanf("%f,%f",&a,&b); float add(); scanf("%f,%f",&a,&b); return(z); c=add(a,b); } c=max(a,b); 被调函数出现在主调函数 printf("sum is %f",c); printf("Max is %d\n",c); main() 之前,不必函数说明 } { } float a,b,c; floatmax(float x, float y) add(float x, float y) scanf("%f,%f",&a,&b); { floatfloat z; z; {c=add(a,b); int型函数可不作函数说明 z=x+y; z=x>y?x:y; (Turbo C 和VC不行) printf("sum is %f",c); return(z); } return(z); } }
函数声明
一般形式: 函数名( 形参名], ],….. 一般形式:函数类型 函数名(形参类型 [形参名], .. ); 函数名(); 或 函数类型 函数名(); 作用:告诉编译系统函数类型 参数个数及类型, 函数类型, 作用:告诉编译系统函数类型,参数个数及类型,以便检验 函数定义与函数说明不同 函数定义与函数说明不同 函数声明位置:程序的数据说明部分(函数内或外) 函数声明位置:程序的数据说明部分(函数内或外)
printstar() { printf("**********"); } main() { int a; a=printstar(); printf("%d",a); } 输出:10
8.3 函数的调用
main() main() 调用形式 { int i=2,p; { int i=2,p; 函数名( 函数名 实参表); p=f(++i, i); p=f(i,++i);(实参表); printf("%d",p); printf("%d",p); 说明: 说明: } } –实参与形参个数相等,类型一致,按顺序一一对应 实参与形参个数相等 实参与形参个数相等,类型一致, int f(int a, int b) int f(int a, int b) 实参表求值顺序, { int c; 自右向左) { int –实参表求值顺序,因系统而定(Turbo C 自右向左) c; 实参表求值顺序 因系统而定( if(a>b) c=1; if(a>b) c=1; else if(a==b) c=0; else if(a==b) c=0; else c=-1; else c=-1; return(c); return(c); } } 运行结果:0 运行结果:1
8.2
函数的返回值
例 无返回值函数
形式: return(表达式); 或 return 表达式; 或 return;
返回语句
void swap(int x,int y ) { int temp; temp=x; x=y; 功能:使程序控制从被调用函数返回到调用函数中, y=temp; 同时把返回值带给调用函数 }
参数传递方式
值传递
–方式:函数调用时,为形参分配单元,并将实参的值复制到形参中; 方式:函数调用时,为形参分配单元,并将实参的值复制到形参中; 方式 复制到形参中 调用结束,形参单元被释放, 调用结束,形参单元被释放,实参单元仍保留并维持原值 –特点: 特点: 特点 形参与实参占用不同的内存单元 形参与实参占用不同的内存单元 不同 单向传递 单向传递
内 容 回 顾
……
函数名(实参列表); 函数名(实参列表);
(1) ) 函数声明
类型标识符 函数名(含类型说明的形参表); 函数名(含类型说明的形参表) (2) ) 函数调用
从用户角度
标准函数(库函数):由系统提供 用户自定义函数
从函数形式
无参函数 有参函数 使用库函数应注意: 1,函数功能 2,函数参数的数目和顺序,及各参数意义和类型 3,函数返回值意义和类型 4,需要使用的包含文件
8.1 函数的定义
一般格式
函数返回值类型 缺省为int int型 缺省为int型 无返回值void 无返回值void
从包含该变量定义的函数开始执行至函数执行结束程序区静态存储区动态存储区全局变量局部静态变量形参变量局部动态变量autoregister函数调用现场保护和返回地址等变量存储类型静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件局部变量默认为auto型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性register局部staticauto外部static外部存储类别intautointstaticintc作用域b作用域a作用域mainf2f1mainf1f2maina生存期
#include <stdio.h> 函数原型(函数 函数原型( int max(int ,int ,int); 声明) 声明) main( ) { int a,b,c; printf("Enter three integers: "); 函数调用 scanf("%d ,%d, %d",&a,&b,&c); printf("Maximum is: %d\n",max(a,b,c)); } /*函数 函数max 的定义 的定义*/ 函数 int max(int x,int y,int z) 函数定义 { int max=x; if (y>max) max = y; 函数体 if (z>max) max= z; return max;}
例
计算x的立方
1.2 ×× 1.728 ×× 1.2
#include <stdio.h> float cube(float x) a product { return(x*x*x); x } main() { float a, product; printf("Please input value of a:"); scanf("%f",&a); product=cube(a); printf("Cube of %.4f is %.4f\n",a,product); }
合法标识符
函数名(形参类型说明表) 函数类型 函数名(形参类型说明表) { 函数体 说明部分 语句部分 } 例 无参函数 例 有参函数 例 空函数 printstar( ) x,int y) int max(int x, y) dummy( ) { {printf("**********\n"); } int z; } 或 { z=x>y?x:y; printstar(void )函数体为空 return(z); { }printf("**********\n"); }
第八章
函数
自动化学院 电子系 陈曦
1 2 3 4 5 6 7
函数的定义 函数的返回值 函数的调用 函数的参数及其传递方式 函数的嵌套和递归调用 数组作为函数参数 变量的存储属性
8.0 概述
模块化程序设计 基本思想:将一个大的程序按功能分割成一些 小模块 特点:
各模块相对独立,功能单一,结构清晰,接口简单 控制了程序设计的复杂性 缩短开发周期 避免程序开发的重复劳动 易于维护和功能扩充
(a, b, c) 4, 60, 1
#include <stdio.h> int max(int ,int ,int); main( ) { int a,b,c; printf("Enter three 2 integers: "); scanf("%d %d %d", &a,&b,&c); printf("Maximum is: %d\n", max(a,b,c)); return 0; 5 }
(1) ) 函数声明 类型标识符 函数名(含类型说明的形参表); 函数名(含类型说明的形参表)
……
函数名(实参列表); 函数名(实参列表);
(2) ) 函数调用
……
类型标识符 函数名(含类型说明形参表) 函数名(含类型说明形参表) { 语句序列; 语句序列; } (3) ) 函数定义
例:查找三个整数中的最大值
开发方法: 自上向下,逐步分解,分而治之
C是模块化程序设计语言
C程序
源程序文件1
源程序文件i
源程序文件n
预编译命令
函数1
函数n
说明部分
执行部分
C程序结构 C是函数式语言 必须有且只能有一个名为main的主函数 C程序的执行总是从main函数开始,在main中结束 函数不能嵌套定义,可以嵌套调用
函数分类
调用方式
函数语句 例 printstar(); printf("Hello,World!\n"); 函数表达式 例 m=max(a,b)*2; 函数参数 例 printf("%d",max(a,b)); m=max(a,max(b,c));
函数说明
函数声明在以下情况可以 对被调用函数要求: 对被调用函数要求: 省略: –必须是已存在的函数 必须是已存在 必须是已存在的函数 1,返回值为char或int –库函数: #include <*.h> 库函数: 库函数 2,函数定义出现在调用 –用户自定义函数: 函数声明 用户自定义函数: 函数声 函数之前 用户自定义函数
说明:
函数中可有多个return语句 若无return语句,遇}时,自动返回调用函数 } 若函数类型与return语句中表达式值的类型不一致, 按前者为准 前者为准,自动转换------函数调用转换 前者为准 void型函数
例
函数带回不确定值
void printstar() { printf("**********"); } main() { int a; a=printstar(); printf("%d",a); } 编译错误!