版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、函数本课主要内容2、变量的作用域与生命周期3、指针4、结构体目 录?1.1 函数作用?1.2 函数定义?1.3 函数调用?1.4 函数参数?1.5 函数返回?1.6 嵌套与递归1.1 函数作用?函数功能-模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块 特点: 各模块相对独立、功能单一、结构清晰、接口简单 控制了程序设计的复杂性 提高元件的可靠性 缩短开发周期 避免程序开发的重复劳动 易于维护和功能扩充 开发方法: 自上向下,逐步分解,分而治之8.1 函数作用语言不仅提供了极为丰富的库函数(如Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自己定义的函数。用
2、户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方式来使用函数。 &C是函数式语言&必须有且只能有一个名为main的主函数&C程序的执行总是从main函数开始,在main中结束&函数不能嵌套定义,但是可以嵌套调用使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件由于采用了函数模块式的结构,语言易于实现结构化程序设计,使程序的层次结构清晰,便于程序的编写、阅读、调试。 目 录?1.1 函数作用?1.2 函数定义?1.3 函数调用?1.4 函数参数?1.5 函数返回?1.6 嵌套与递归1
3、.2 函数定义一般格式合法标识符函数返回值类型缺省为int型无返回值为void函数体函数类型 函数名(形参类型说明表)说明部分语句部分现代风格:例 无参无返值函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 例 有参有返值函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); 8.2 函数定义例 空函数 dummy( ) ;函数体为空例 有参函数(现代风格) int max(int x, y) int z; z=xy?x:y; return(z); 函数类型
4、函数名(形参表)形参类型说明说明部分语句部分传统风格:(少用)例 有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 1.2 函数定义?返回语句 形式: return(表达式); 或 return 表达式; 或 return; 功能:使程序控制从被调用函数返回到调用函数中,有返值则带给调用函数 说明: 函数中可有多个return语句 若无return语句,遇时,自动返回调用函数 若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换 void型函数无返回值函数返回值1.2 函数定义int ma
5、x(float x, float y) return (xy)?x:y;int main(void) float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c); return 0;函数返回值目 录?8.1 函数作用?8.2 函数定义?8.3 函数调用?8.4 函数参数?8.5 函数返回?8.6 嵌套与递归1.3 函数调用? 调用形式 函数名(实参表)说明:函数应该在main函数前定义或声明实参与形参个数相等,类型一致,按顺序一一对应实参表求值顺序,因系统而定C语言是自右自左或者是以尽可能快的方式
6、将参数压栈,因此第一个计算的通常是最右边参数表达式1.3 函数调用 函数语句: 例 printstar(); printf(Hello,World!n); 函数表达式: 例 m=max(a,b)*2; 函数参数: 例 printf(%d,max(a,b); m=max(a,max(b,c);函数调用方式1.3 函数调用 对被调用函数要求: 必须是已存在或者被声明了的函数 库函数: #include 用户自定义函数: 函数类型说明 函数说明 一般形式: 函数类型 函数名(形参类型 形参名,. ); 或 函数类型 函数名(); 作用:告诉编译系统函数类型、参数个数及类型,以便检验 函数定义与函数声
7、明不同 函数声明位置:程序的数据说明部分(函数内或外) 若函数返值是char或int型,系统自动按int型处理 被调用函数定义出现在主调函数之前,可省略被调函数的声明函数调用说明1.3 函数调用float add(float x, float y) return(x+y);int main(void) float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c); return 0;被调函数出现在主调函数之前,不必进行函数声明函数调用示例11.3 函数调用float add(float x,float y) ;
8、 /*函数声明*/int main(void) float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c); return 0;float add(float x, float y) return(x+y);函数调用示例21.3 函数调用int main(void) float add(float,float); /*函数声明*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c); return 0;float a
9、dd(float x, float y) return(x+y);函数调用示例3目 录?1.1 函数作用?1.2 函数定义?1.3 函数调用?1.4 函数参数?1.5 函数返回?1.6 嵌套与递归1.4 函数参数l说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放形参与实参l形式参数:定义函数时,函数名后面括号中的变量名l实际参数:调用函数时,函数名后面括号中的表达式函数参数说明1.4 函数参数c=max(a,b);(main 函数)(max 函数)m
10、ax(int x, int y) int z; z=xy?x:y; return(z); 例 比较两个数并输出大者max(int x, int y) int z; z=xy?x:y; return(z);main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);形参实参函数参数示例1.4 函数参数 值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递参数值传递1.4 函数参数711x:y:
11、调用前:调用结束:711x:y:#include main() int x=7,y=11; printf(x=%d, y=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,y=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;调用:711a:b:711x:y:swap:711x:y:117a:b:temp参数值传递示例1.4 函数参数 地址传递方式:函数调用时,将数据的存储地址作为参数传递给形参特点:形参与实参指向同样的存储单元“双向”传递实参和形参必须是地址常量或变量 地址传
12、递的作用减少函数调用开销,如果一个大结构用地址传递,会大大节约开销可以返回多个返回值,函数return只能返回一个值,如果是多个,必须要放在函数参数当中,作值传递.参数地址传递1.4 函数参数swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; scanf(%d,%d,&a,&b); printf(“a=%d,b=%dn”,a,b); printf(“swapped:n”); swap(&a,&b); printf(”a=%d,b=%dn,a,b);a59b调前:a59b调swap
13、:p1&a&bp2a95b交换:p1&a&bp2a95b返回:参数地址传递示例1.4 函数参数? 如果是对地址值所指向的空间作操作,那这相当于地址传递? 如果是需要修改地址值本身,则这个地址值相当于是值传递模式参数传递总结1.4 函数参数l数组元素作为函数参数l相当于值传递l数组名作为函数参数l地址传递l在主调函数与被调函数分别定义数组,类型应一致l形参数组名是地址变量l形参是多维数组时,数组的第一维大小可不指定数组作为函数参数1.4 函数参数#include void swap2(int x,int y) int z; z=x; x=y; y=z;main()
14、 int a2=1,2; swap2(a0,a1); printf(a0=%dna1=%dn,a0,a1);值传递12a调用前a0a112a调用a0a112xy21xy交换12a返回数组元素作为参数1.4 函数参数12a调用前12ax调用21ax交换21a返回#include void swap2(int x2) int z; z=x0; x0=x1; x1=z;main() int a2=1,2; swap2(a); printf(a0=%d n a1=%dn,a0,a1);地址传递数组名作为参数目 录?8.1 函数作用?8.2 函数定义?8.3 函数调用?8.4 函数参数?8.5 函数返回
15、?8.6 嵌套与递归8.5 函数返回? 函数体中有return语句,且程序执行到return时返回? 函数返回值通常是return语句后的表达式? 若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换? 对于void型函数:执行return;语句返回或者函数结束后自动返回? 对于非void型函数:执行return(表达式);或者return 表达式;返回,或者函数结束后自动返回;如果没有return语句,编译器发出警告;目 录?1.1 函数作用?1.2 函数定义?1.3 函数调用?1.4 函数参数?1.5 函数返回?1.6 嵌套与递归1.6 嵌套与递归?嵌套调用C规定:函数
16、定义不可嵌套,但函数调用可以嵌套main( )调用函数a结束a函数b函数调用函数b嵌套函数调用1.6 嵌套与递归#include int dif(int x,int y) return max(x,y)-min(x,y); int max(int x,int y) return(xy?x:y); int min(int x,int y,int z) return(xy?x:y); main() int a,b,d; scanf(%d%d,&a,&b,); d=dif(a,b); printf(Max-Min=%dn,d); main( )调用函数dif输出结束dif函数max函
17、数调用函数max调用函数minmin函数嵌套函数调用指针?2.1 指针概念与指针变量?2.2 取址与取值运算符?2.3 指针与一维数组?2.4 指针与字符串2.1 指针概念C中的指针指针式C语言显著的优点之一,指针使用起来灵活而且能提高某些程序的效率。但是指针使用不当,很容易造成系统错误,许多程序“挂死”的大部分都是由于错误地使用指针所造成的。2.2 地址与指针? 系统的内存就像带有编号的小房间,如果要使用内存,就需要得到房间编号。? 比如定义一个整型变量,需要四个字节,所以编译器为整型变量分配的编号为1000-1003.内存与地址2.2 地址与变量程序中: short i; float k;
18、 内存中每个字节有一个编号-地址.2000200120022005内存02003ik 编译或函数调用时为其分配内存单元,每个变量占用若干字节内存变量是对程序中数据存储空间的抽象变量与地址2.2地址与变量.2000200420062005整型变量i11变量i_pointer200120022003l指针:一个变量的地址l指针变量:专门存放变量地址的变量叫2000指针指针变量 变量的内容 变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量指针的由来2.2 指针变量l一般形式: 存储类型 数据类型 *指针名;合法标识符指针变量本身的存储类型指针的目标变量的数据类型表示定义指针变量不是*
19、运算符例 int *p1,*p2; float *q ; static char *name;注意:1、int *p1, *p2; 与 int *p1, p2;不同2、指针变量名是p1,p2 ,不是*p1,*p23、指针变量只能指向定义时所规定类型的变量4、指针变量定义后,变量值不确定,使用前必须先赋值指针变量的定义指针?2.1 指针概念与指针变量?2.2 取址与取值运算符?2.3 指针与一维数组?2.4 指针与字符串2.3 取址与取值运算符&含义: 取变量的地址单目运算符优先级: 2结合性:自右向左*含义: 取指针所指向变量的内容单目运算符优先级: 2结合性:自右向左l取址&
20、和取值*两者的关系:互为逆运算l理解.2000200420062005整型变量i11变量i_pointer2001200220032000指针变量&和*运算符2.3 取址与取值运算符? 已知int a,b; int * p=&a;? p = &b; 把ii的地址取出来赋给指针变量p? b = *p; 把p所指向的内容赋给b? *(&a) = b;等效于 a = b;&和*运算符2.3 取址与取值运算符i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内容是数据&i_pointer-指针变量占用内存的地址200
21、011i_pointer=&i*i_pointer&i_pointerii_pointer = &i = &(*i_pointer)i = *i_pointer = *(&i)int i=11;int *i_pointer=&i;&和*运算符2.3 取址与取值运算符 直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量例 i=3; -直接访问指针变量.2000200420062005整型变量i11变量i_pointer20012002200320003例 *i_pointer=20; -间接访问20变量的访问2.3
22、取址与取值运算符指针变量.2000200420062005整型变量i11变量i_pointer2001200220032000整型变量k例 k=i; -直接访问 k=*i_pointer; -间接访问11变量的访问2.3 取址与取值运算符一般形式:存储类型 数据类型 *指针名=初始地址值;赋给指针变量,不是赋给目标变量例 int i; int *p=&i;变量必须声明过类型应一致例 int *p=&i; int i;例 int i; int *p=&i; int *q=p;用已初始化指针变量作初值指针变量初始化指针?2.1 指针概念与指针变量?2.2 取址与取值运算符?
23、2.3 指针与一维数组?2.4 指针与字符串2.5 指针与一维数组 指向数组元素的指针变量例 int array11; int* p; p=&array0; /p=array;或 int* p=&array0;或 int* p=array;array0array1array2array3array9.整型指针p&array0p数组名是表示数组首地址的地址常量指针数组的指针2.5 指针与一维数组已知int *p 与 int arr11 ,则有如下运算l数组名相当于是指针(地址)常量1.p=arr; 把数组的首地址赋给指针变量2.arri *(p+i)等效关系,都表示取数组
24、的第i个元素3.pi *(arr+i) arri 把公式1代入公式2,则有上述完全等效的公式,并且与2完全相等4.p+i arr+i &arri指针表示法,表示数组第i个元素的地址指针数组的指针2.5 指针与一维数组int main(void) int a5, *pa , i; for(i=0;i5;i+) ai=i+1; pa=a; for(i=0;i5;i+) printf(*(pa+%d):%dn,i, *(pa+i); for(i=0;i5;i+) printf(*(a+%d):%dn,i, *(a+i); for(i=0;i5;i+) printf(pa%d:%dn,i, p
25、ai); for(i=0;i5;i+) printf(a%d:%dn,i, ai); return 0;a0a1a2a3a412345pa数组元素引用示例2.5 指针与一维数组int main(void) int a7=5,8,7,6,2,7,3; int i, *p=a; printf(n); for(i=0;i7;i+,p+) printf(%d ,*p);pp58762730123456apppppp指针变量可以指到数组后的内存单元指针变量的当前值指针?2.1 指针概念与指针变量?2.2 取址与取值运算符?2.3 指针与一维数组?2.4 指针与字符串2.6 指针与字符串? 字符串是一个典
26、型的字符数组,因此即可以按数组一样来处理字符串,也能用指针来处理字符串? 按数组来遍历字符串例 void ShowStr(char *str ) int i,len; len = strlen(str); for(i=0; i len ;i+) putchar(stri); printf(n); 指针处理字符数组2.6 指针与字符串? 用数组和strlen配合使用,实际做了两次字符数组扫描。strlen扫描一次,显示字符串扫描一次,因此效率偏低,一般用指针做一次遍历。例 void ShowStr(char *str ) char *p; for(p=str; *p!=0 ;p+) putcha
27、r(*p); printf(n); 指针处理字符数组2.6 指针与字符串? 字符串拷贝函数char * my_strcpy(char * dst, char * src) char * tmp = dst; if( !dst ) return 0; while( (*dst = *src) != 0 ) dst+ ; src+; return tmp;字符指针的应用2.6 指针与字符串? 以下两种初始化方法有何区别? char * p = hello,the World! ; char a = hello,the World! ;? 前者是字符指针.字符串的空间是一个常量字符串,并且保存在只读
28、的内存空间中。p只是记录这个字符串地址。这段这段内存区是只读的内存区是只读的.? 后者是字符数在堆栈或数据区分配一段空间,并且把字符串设为指定内容。数据内容可读可写字符数组和字符指针2.6 指针与字符串? 以下是常见的错误,对字符指针的只读内容进行修改void error_code() char * p = hsc; *p = H;void error_func(char * str) *p = H;int error_code()/给形参str分配一个只读字符串 error_func(hsc); return 0;字符数组和字符指针2.6 指针与字符串void right_func(char * str) *p = H; int right_code() char a=hsc; right_func(a); return 0;? 对字符数组的内容可以进行读写字符数组和字符指针2.6 指针与字符串char *cp; 与 char str20; str由若干元素组成,每个元素放一个字符;而cp中存放字符指针 char str20; str=I love China! ; (X) char *cp; cp=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年天祝藏族自治县医疗事业单位人员招聘考试备考试题及答案解析
- 2026年竹山县医疗事业单位人员招聘考试参考题库及答案解析
- 2026年马边彝族自治县医疗事业单位人员招聘笔试参考题库及答案解析
- 2026年修武县医疗事业单位人员招聘考试备考题库及答案解析
- 2026年平顺县带编教师招聘笔试备考题库及答案解析
- 2026年西盟佤族自治县医疗事业单位人员招聘笔试备考题库及答案解析
- 2026年茂县医疗事业单位人员招聘考试参考题库及答案解析
- 2026年涟水县医疗事业单位人员招聘考试参考题库及答案解析
- 2026年翁源县医疗事业单位人员招聘笔试备考试题及答案解析
- 2026年灵石县医疗事业单位人员招聘考试备考试题及答案解析
- 普华永道:2026年全球AI就业晴雨表-AI时代就业的两种未来图景(2026年-中文版)
- 2026秋小学西师大版音乐二年级上册(新教材)教学计划含教学进度表
- 《物流成本管理》全套教学课件
- 小学科学苏教版(新教材)六年级上册第一单元《物质的变化》单元小结课件
- 2026年计算机专业综合应用题库
- 油田集输系统技术培训课件
- 阅读理解(专项训练)五升六英语暑假专项提升(人教PEP版)
- 小区绿化养护合同
- 2026年秋季六年级数学上册教学计划(人教版)
- GB/T 32741-2025肥料、土壤调理剂和有益物质分类
- 当代西方社会思潮研究
评论
0/150
提交评论