版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020年8月1日星期六,济南大学信息学院,第三章 模块化程序设计,3.1 模块化程序设计思想 3.2 函数定义 3.3 函数调用 3.4 函数的原型与声明 3.5 函数的嵌套与递归 3.6 库函数 3.7 变量的作用域与存储类型 3.8 指针与函数,2020年8月1日星期六,济南大学信息学院,3.6 库函数,库函数:即系统已经定义好、具有特定功能的函数。这些函数可以直接使用,不必重新定义,但使用时需要用#include命令把相应的头文件包含进来。,输入输出函数(头文件:stdio.h): printf( ) scanf( ) getchar( ) putchar( ),数学函数(头文件:ma
2、th.h): sqrt( ) pow( ) fabs( ) log10( ) log( ),字符串函数(头文件:string.h): strcpy( ) strcat( ) strcmp( ) strlen( ),各函数的功能见附录,使用时注意参数个数及类型、函数的返回值。,2020年8月1日星期六,济南大学信息学院,3. 变量的作用域与存储类型,3.7.1 变量的作用域,作用域:指变量能够起作用的程序范围,2020年8月1日星期六,济南大学信息学院,1 局部变量,#include int max(int x, int y) int z; if (xy) z=x; else z=y; retu
3、rn(z); void main( ) int a,b,c; scanf(%d%d, ,1、局部变量: 指在一个函数或复合语句内部(位于一对花括号之间)定义的变量;只在本函数或复合语句的范围内有效,x、y、z的有效范围,a、b、c的有效范围,2020年8月1日星期六,济南大学信息学院,2、说明: 、main函数中定义的变量是局部变量,只能在main函数中使用,、不同函数中可以使用相同名字的变量,它们占用不同的内存单元,互相独立 、形式参数也是局部变量 、复合语句中定义的变量,其作用域只是本复合语句,void main( ) int a, b; int c; c=a+b; ,c在此范围内有效,a
4、、b在此范围内有效,2020年8月1日星期六,济南大学信息学院,#include void main( ) int i,a=0; for (i=1; i=2; i+) int a=1; a+; printf(i=%d, a=%dn, i, a); printf(i=%d, a=%dn, i, a); ,i=1, a=2 i=2, a=2 i=3, a=0,EG311.C,2020年8月1日星期六,济南大学信息学院,2 全局变量,1、定义: 全局变量:指在所有函数外部定义的变量,又称外部变量 可以为本文件中其它函数所共用,其有效范围为:从定义变量的位置开始到本源文件结束,2、例:,2020年8月
5、1日星期六,济南大学信息学院,#include int p=1, q=5; float f1( int a ) float r ; : int s; int f2( int b , int c ); int sum; : float m, n; void main( ) float x, y; : ,2020年8月1日星期六,济南大学信息学院,3、说明: 、全局变量增加了函数间的数据联系; 由于在同一文件中的所有函数都能使用全局变量, 所以可以利用全局变量从函数中得到一个以上的返回值,、建议不要过多的使用全局变量,全局变量在程序的执行过程中一直占用存储单元 它使函数的通用性降低 会降低程序的清
6、晰性,EG312.C,2020年8月1日星期六,济南大学信息学院,、全局变量在定义时如果没有初始化,它们则会被系统自动初始化为零,而局部变量在定义时不会自动初始化。 、若全局变量与局部变量同名,则在局部变量的作用范围内,全局变量不起作用,int a=3, b=5; int max(int a, int b) int c; c=ab ? a : b; return(c); void main( ) int a=8; printf(%d, max(a, b) ); ,形参a、b的作用域 全局变量a、b不起作用,局部变量a的作用域 全局变量b的作用域 全局变量a不起作用,EG313.C,2020年8
7、月1日星期六,济南大学信息学院,3.7.2 变量的存储类型,变量的存储类型是指存储变量值的内存类型。它决定变量何时创建、何时销毁以及它的值将保存多久。 变量的存储类型可分为“静态存储”和“动态存储”两种。,静态存储变量通常是在变量定义时就分配存储单元并一直保持不变,直到整个程序结束。全局变量即属于此类存储方式。 动态存储变量是在程序执行过程中,使用到它时才分配存储单元,使用完毕立即释放。如形参,函数被调用时才分配内存单元,函数调用完毕立即释放。,2020年8月1日星期六,济南大学信息学院,局部变量的存储类别:,1、函数中的局部变量,如不专门声明或用auto声明,称为自动变量或动态变量。通常au
8、to被省略。在前面各章中所学习到的变量都属于auto变量。,int b, c=3; float f;,auto int b,c=3; auto float f;,2、局部静态变量(static) 函数被调用时分配内存单元,函数调用结束后不释放占用内存单元,直到程序运行结束才释放存储单元,即在整个程序的运行中不释放存储单元。,static int i,area; static int a10;,2020年8月1日星期六,济南大学信息学院,比较下列两个程序的输出结果:,#include void fun(int x) int a=0; a+=2; printf(x=%d,a=%dn,x,a); v
9、oid main( ) int i; for (i=1;i=3;i+) fun(i); ,#include void fun(int x) static int a=0; a+=2; printf(x=%d,a=%dn,x,a); void main( ) int i; for (i=1;i=3;i+) fun(i); ,x=1,a=2 x=2,a=2 x=3,a=2,x=1,a=2 x=2,a=4 x=3,a=6,EG315.C,2020年8月1日星期六,济南大学信息学院,说明:若对变量赋初值,对于自动变量,每次调用都要重新分配内存单元并赋初值;而对于静态变量,只执行一次,再次调用函数时不再
10、赋初值而保留上次函数调用结束时的值;,#include void fun(int x) static int a=0; a+=2; printf(x=%d,a=%dn,x,a); void main( ) int i; for (i=1;i=3;i+) fun(i); ,x=1,a=2 x=2,a=4 x=3,a=6,EG316.C,说明: 对于动态变量,定义时若不赋值,值不确定 对于静态变量,定义时若不赋值,系统自动赋值为0,2020年8月1日星期六,济南大学信息学院,2.6 指针程序设计,1、地址 在计算机中,把内存区划分为一个一个的存储单元,每个单元为一个字节(位),它们都有一个编号,这
11、个编号就是内存单元的地址。,说明: 1、每个变量都占有各自的内存单元,具有相应的地址 。 2、一个变量所占有的内存单元个数是由其类型决定的。 3、首地址:变量所占第1个字节的地址,2020年8月1日星期六,济南大学信息学院,变量的访问方式 直接访问:通过变量名或变量名所对应的地址访问变量的存储区,存取其值。,int x; x=3; printf(“x=%dn”, x);,间接访问:将一个变量的地址存放在另一个变量中 ,使用时先找到后者的地址,再从中取出前者的地址。,2020年8月1日星期六,济南大学信息学院,指针变量的概念 存放变量地址的变量, 它用来指向另一个变量。,某个变量的地址,指针变量
12、:存放变量的地址,指向,指针的概念 由于通过地址能找到所需的变量单元,地址象一根针一样“指向”该变量单元。所以将地址形象的称为:“指针”。,2020年8月1日星期六,济南大学信息学院,指针变量的定义 基类型名 *指针变量名=初始值;,例:int *p; p是指向整型变量的指针变量 float x,*q= r是?,说明 基类型名是指针变量指向的变量的数据类型 在变量定义时, * 号表示该变量是指针变量,不可省 ,以和普通变量区别。 注意:指针变量名是p,而不是*p,*在定义时只是个符号。,2020年8月1日星期六,济南大学信息学院,指针变量的赋值 定义指针变量时进行初始化,或使用赋值语句。 指针
13、变量定义后,若不赋值,其值是不确定的(野指针) 两个运算符 :取地址运算符。 可作用于一般变量或指针变量 * :指针运算符(在非定义时)只能作用于指针变量,(使用赋值语句给指针变量赋值) 例:int *p, x; x = 3; p = 把x的地址赋给p, 即p指向x,(定义时初始化) int x, *p=,(通过其它指针赋值) int i, *p1=,(还可以给指针变量附空值) p=NULL;,2020年8月1日星期六,济南大学信息学院,使用指针变量时,需注意的几个问题: 只能用同类型变量的地址给指针变量赋值 例:int x, *p; p=相同。,2020年8月1日星期六,济南大学信息学院,例
14、:指针变量的赋值操作 #include void main() int a, b; int *p1, *p2; a=100; b=10; p1= ,100,10,a,b,p1,p2,*p1,*p2,结果: 100,10 100,10,2020年8月1日星期六,济南大学信息学院,例-1: #include void main() int a, b; int *p1, *p2; a=100; b=10; p1 = ,100,10,a,b,p1,p2, int *p1= ,100,10,a,b,p1,p2, p= ,2020年8月1日星期六,济南大学信息学院,例2.24 输入两个数,并按从大到小输出
15、,用指针完成。,一定注意两种不同的程序设计方法。,重要,2020年8月1日星期六,济南大学信息学院,3.8 指针与函数,例3.10:在主函数中输入两个整数a和b,编写函数交换a、b的值,void main( ) int a,b; printf(Input a,b:); scanf(%d%d, ,#include void swap(int x, int y) int temp; temp=x; x=y; y=temp; ,EG317.C,2020年8月1日星期六,济南大学信息学院,例3.10即: #include void swap(int a, int b) int t; t=a; a=b;
16、 b=t; void main( ) int x5, y10; printf(“交换前:%d, %dn”, x,y); swap(x, y); printf(“结束后:%d, %dn”, x, y); ,10,main,swap,5,10,5,5,10,5,输出结果: 交换前:5, 10 结束后:5, 10,2020年8月1日星期六,济南大学信息学院,3.8.1 指针作为函数参数,1、形参:只需要形参前加上一个*即可。 如:void swap(int *pa, int *pb),2、说明 函数中可以通过形参引用实参的地址,从而可以改变该地址的值,即实参变量的值。,void main( ) in
17、t a; fun( ,void fun(int *pa) *pa=10; ,2020年8月1日星期六,济南大学信息学院,void main( ) int x5, y9; int *p1, *p2; p1 = , t=*a; *a=*b; *b=t; ,2020年8月1日星期六,济南大学信息学院,#include void swap(int *pa, int *pb) int t; t=*pa; *pa=*pb; *pb=t; void main( ) int a, b; printf(Input a, b: ); scanf(%d%d, ,EG322.C,如何通过函数调用达到改变某个变量的值? 分三步: 1、在主调函数中,把该变量的地址作为实参 2、在被调函数中,用形参(指针)接受该地址 3、在被调函数中,改变形参(指针)所指向变量的值,而不是形参本身的值(地址),2020年8月1日星期六,济南大学信息学院,例:编写函数,求三个整数的和以及平均值。用指针
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026四年级数学上册 三位数乘两位数学习策略
- 关于白氏的研究报告
- 火星基地的研究报告
- 关于候鸟的勇敢研究报告
- 客户心理论文研究报告
- 广州美国桑黄研究报告
- 保姆用工合同
- (一模)2026年张家口市高三模拟考试英语试卷(含答案解析)
- 海外游戏代理 研究报告
- 风力发电技术行业研究报告
- 2026年苏州工业职业技术学院单招职业技能测试必刷测试卷附答案
- 2025年陕西省中考化学试题答案解读及备考指导课件
- 新市民课件教学课件
- GB/T 20013.1-2025核医学仪器例行试验第1部分:γ辐射计数系统
- 2025年甘肃省高考数学真题(新课标ⅱ卷)(含答案解析)
- 五年(2021-2025)高考生物真题分类汇编专题专题08 生物与环境(解析版)(河北专用)
- 前鼻韵母unvn课件
- 2025年政治法制素养题库及答案
- 中山市招投标管理办法
- 医院一站式服务课件
- 板式支护、槽钢支护施工方法
评论
0/150
提交评论