C语言知识点串讲 (2).ppt

上传人:小飞机 文档编号:6503957 上传时间:2023-11-07 格式:PPT 页数:185 大小:602KB
返回 下载 相关 举报
C语言知识点串讲 (2).ppt_第1页
第1页 / 共185页
C语言知识点串讲 (2).ppt_第2页
第2页 / 共185页
C语言知识点串讲 (2).ppt_第3页
第3页 / 共185页
C语言知识点串讲 (2).ppt_第4页
第4页 / 共185页
C语言知识点串讲 (2).ppt_第5页
第5页 / 共185页
点击查看更多>>
资源描述

《C语言知识点串讲 (2).ppt》由会员分享,可在线阅读,更多相关《C语言知识点串讲 (2).ppt(185页珍藏版)》请在三一办公上搜索。

1、计算机二级C语言程序设计知识点串讲,2023/11/7,2,一、C语言程序的结构1.程序的构成,main函数和其他函数。2.头文件,数据说明,函数的开始和结束标志以及程序中的注释。3.源程序的书写格式。4.C语言的风格。,2023/11/7,3,目标,熟记C语言的基本概念熟悉VC+6.0 的上机操作环境会读、会编、会调试程序,2023/11/7,4,C语言结构特点:(1)C程序是由函数构成的。(2)一个函数由两部分组成:函数的首部和函数体。(3)main函数通常位于程序之首,实际上它位于程序的开头、最后及函数与函数之间均是合法的,但不管在什么位置,一个C程序总是从main函数开始执行的。(4)

2、C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上。(5)每条语句以分号结束,分号是语句的必要组成部分。(6)C语言本身没有输入输出语句。(7)可以用/*/对C程序中的任何部分作注释,它可增加程序的可读性。,2023/11/7,5,C语言的基本词法,1.标识符 标识符是以字母、数字和下划线组成的,但第一个字符必须是字母或下划线。而且字母区分大小写。,2.关键字 关键字又称保留字,C语言编译系统对关键字赋有专门的含义。Turbo C共有43个关键字。,3.字符集 C语言的字符集包括:大小写英文字母、数字、下划线及*/,;?“.&|()等,还有不可打印字符空格、换行符、制表符。,2

3、023/11/7,6,函数的一般结构 任何函数(包括主函数main())都是由函数说明和函数体两部分组成。其一般结构如下:函数返回值的类型 函数名(函数参数表)说明语句部分;执行语句部分;,函数首部,函数体,函数返回值的类型 函数名 函数参数表 int max(int x,int y),2023/11/7,7,C语言的语句和关键字,(一)C语言的语句 与其它高级语言一样,语言也是利用函数体中的可执行语句,向计算机系统发出操作命令。按照语句功能或构成的不同,可将语言的语句分为五类。1.控制语句控制语句完成一定的控制功能。语言只有条控制语句,又可细分为三种:(1)选择结构控制语句 if()else

4、,switch()(2)循环结构控制语句 dowhile(),for(),while(),break,continue,2023/11/7,8,(3)其它控制语句 goto,return 2.函数调用语句 函数调用语句由一次函数调用加一个分号(语句结束标志)构成。3.表达式语句表达式语句由表达式后加一个分号构成。最典型的表达式语句是,在赋值表达式后加一个分号构成的赋值语句。4.空语句空语句仅由一个分号构成。显然,空语句什么操作也不执行。5.复合语句复合语句是由大括号括起来的一组(也可以是1条)语句构成。,2023/11/7,9,运行C的步骤与方法,1.编辑:选择适当的编辑程序,将C语言源程序通

5、过键盘输入到计算机中,并以文件的形式存入到磁盘中(.C)2.编译:即将源程序翻译成机器语言程序的过程。编译出来的程序称为目标程序(.OBJ)3.连接:编译后生成的目标文件经过连接后生成最终的可执行程序(.EXE),2023/11/7,10,二、数据类型及其运算 1.C的数据类型(基本类型,构造类型,指针类型,无值类型)及其定义方法。2.C运算符的种类、运算优先级和结合性。3.不同类型数据间的转换与运算。4.C表达式类型(赋值表达式,算术表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式)和求值规则。,2023/11/7,11,一般用大写字母是宏定义预处理命令,不是C语句直接常量:整型常量

6、实型常量 字符常量 字符串常量,常量定义:程序运行时其值不能改变的量(即常数)分类:符号常量:用标识符代表常量定义格式:#define 符号常量 常量,2023/11/7,12,变量概念:其值可以改变的量变量名与变量值变量说明的一般格式:数据类型 变量1,变量2,变量n;变量的显式初始化:说明时赋初值变量的使用:先说明,后使用变量定义位置:一般放在函数开头,2023/11/7,13,数据类型数据类型总表,数据类型决定:1.数据占内存字节数2.数据取值范围3.其上可进行的操作,2023/11/7,14,不同类型数据间的转换隐式转换什么情况下发生运算转换-不同类型数据混合运算时赋值转换-把一个值赋

7、给与其类型不同的变量时输出转换-输出时转换成指定的输出格式函数调用转换-实参与形参类型不一致时转换运算转换规则:不同类型数据运算时先自动转换成同一类型,2023/11/7,15,显式转换(强制转换)一般形式:(类型名)(表达式)例(int)(x+y)(int)x+y(double)(3/2)(int)3.6,2023/11/7,16,运算符和表达式,2023/11/7,17,学习运算符应注意:运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向 结果的类型,2023/11/7,18,算术运算符和表达式基本算术运算符:+-*/%结合方向:从左向右优先级:(正负)+-*/%-+

8、-(加减)(2)(3)(4)说明:“+”、“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据自增、自减运算符+-作用:使变量值加1或减1种类:前缀式+i,-i(先执行i+1或i-1,再使用i值)后缀式 i+,i-(先使用i值,再执行i+1或i-1),2023/11/7,19,赋值运算符和表达式简单赋值运算符符号:=格式:变量标识符=表达式作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符种类:+=-=*=/=%=&=|=含义:exp1 op=exp2 exp1=exp1 op exp2,2023/11/7,20,顺序求值运算符(逗号运算符)和表达式形式:表达

9、式1,表达式2,表达式n结合性:从左向右优先级:15逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,2023/11/7,21,关系运算符和表达式关系运算符种类:=!=结合方向:自左向右优先级别:,关系表达式的值:是逻辑值“真”或“假”,用1和0表示,2023/11/7,22,逻辑运算符和表达式逻辑运算符种类:!&|逻辑运算真值表,C语言中,运算量:0表示“假”,非0表示“真”,运算结果:0表示“假”,1表示“真”,2023/11/7,23,条件运算符与表达式一般形式:expr1?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句条件运算符可嵌套 如 x0?

10、1:(x0?-1:0)优先级:13结合方向:自右向左,2023/11/7,24,三、基本语句1.表达式语句,空语句,复合语句。2.输入输出函数的调用,正确输入数据并正确设计输出格式。,2023/11/7,25,说明,1、所谓输入输出是以计算机为主体而言的。2、输入输出操作是由函数实现的。,标准输入输出函数,putchar()getchar()puts()gets()printf()scanf(),预编译命令,在使用C语言库函数时,要用预编译命令#include将有关的头文件包括到用户源文件中。,举例,#include main()printf(Hello!);,#include stdio.h

11、,注:在TC环境中,若使用printf()或scanf()函数,则前面的预编译命令可以省略!在VC+环境中不能省略!,(一)、C的输入与输出,2023/11/7,26,格式,printf(格式控制字符串,输出列表);,说明,1、格式控制字符串是用双撇号引起来的字符串,包括三种信息:(1)格式说明:由%和格式字符组成。(如%d、%f)(2)普通字符:需要按原样输出的字符。(3)转义字符:(如t、n、b、r等)2、输出列表是需要输出的一些数据,可以是表达式。,将输出的数据转换为指定的格式输出。,(二)、格式输出printf函数,作用,向终端(或系统默认的输出设备)输出若干个任意类型的数据。,202

12、3/11/7,27,格式说明必须以开始,以格式字符结束。一般形式如下:%标志 宽度.精度 l 格式字符,-,-,n,m,d/f/c/u/s等,长整型整数,输出数据向左靠拢,输出数据最小宽度,对实数:输出小数点位数;对字符串:截取字符的个数,格式说明的一般形式,2023/11/7,28,格式字符,格式字符 格式说明,d,i 以带符号的十进制数输出整数(正数不输出符号)c 以字符形式输出,只输出一个字符f 以小数形式输出单、双精度数,隐含6位小数e,E 以指数形式输出实数o 以八进制无符号形式输出整数(不输出前导符0)x,X 以十六进制无符号形式输出整数(不输出前导符0 x),附加格式说明字符,格

13、式字符,2023/11/7,29,格式,scanf(格式控制字符串,地址列表);,说明,1、格式控制字符串与printf函数类似。可以包含以下三种类型 的信息:格式说明:与printf类似,以开始,以一个格式字符结束;空白字符(空格、t、n):输入多个数据时的缺省分隔符,可以省略,在输入数据时可以以任一种空白字符分隔;普通字符(照原样输入)。2、地址表列是由若干个地址组成的列表,各地址之间用逗号分隔。如变量的地址表示为:&变量名。,(三)、格式输入scanf函数,作用,从终端(或系统默认的输入设备)输入若干个任意类型的数据。,2023/11/7,30,例1,从键盘输入一个大写字母,转换成相应的

14、小写字母输出。,#include void main()char c1,c2;/增强人机交互性。printf(请输入一个大写字母:);c1=getchar();printf(%c,%dn,c1,c1);c2=c1+32;printf(%c,%dn,c2,c2);,请输入一个大写字母:AA,65a,97,四、顺序结构程序设计(写程序结果),在顺序结构程序中,各语句(或命令)是按照位置的先后次序,顺序执行的,且每条语句都会被执行到。,运行情况:,2023/11/7,31,四、选择结构程序设计1.用if语句实现选择结构。2.用switch语句实现多分支选择结构。3.选择结构的嵌套。,2023/11/

15、7,32,if语句,1.If语句的三种基本形式(1)if(表达式)语句例:if(xy)printf(“%d”,x);,2023/11/7,33,if语句,(2)if(表达式)语句1 else 语句2例:if(xy)printf(“%d”,x);else printf(“%d”,y);,2023/11/7,34,if语句,(3)if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 else if(表达式m)语句m else 语句n,2023/11/7,35,if语句,2.If语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。形式:If()if

16、()语句1else 语句2Elseif()语句3else 语句4,内嵌if,Else总是与它上面的,最近的,统一复合语句中的,未配对的if语句配对。,2023/11/7,36,switch语句,switch语句的格式:switch(表达式)case常量表达式:语句 case常量表达式:语句 case常量表达式:语句 default:语句,2023/11/7,37,五、循环结构程序设计1.for循环结构。2.while和do-while循环结构。3.continue语句和break语句。4.循环的嵌套。,2023/11/7,38,用while语句实现循环,注意:循环体如果包含一个以上的语句,应该

17、用花括弧括起来,以复合语句形式出现。在循环体中应有使循环趋向于结束的语句。如果无此语句,则i的值始终不改变,循环永不结束。,2023/11/7,39,用do-while语句实现循环,do-while语句的特点:先执行循环体,然后判断循环条件是否成立。一般形式:do 循环体语句 while(表达式);,2023/11/7,40,用for 语句实现循环,C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。一般形式:for(表达式1;表达式2;表达式3)语句,2023/11/7,41,2023/11

18、/7,42,循环的嵌套,一个循环体内又包含另一个完整的循环结构 称为循环的嵌套。内嵌的循环中还可以嵌套 循环,这就是多层循环。三种循环(while循环、do-while循环和for循 环)可以互相嵌套。,2023/11/7,43,循环的嵌套,下面几种都是合法的形式:(1)while()(2)do(3)for(;)while()do for(;)while();while();,2023/11/7,44,循环的嵌套,(4)while()(5)for(;)(6)do do while()for(;)while()while(),2023/11/7,45,几种循环的比较,(1)四种循环都可以用来处理

19、同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。(2)在while循环和do-while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i+,或i=i+1等)。,2023/11/7,46,几种循环的比较,for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。(3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中

20、实现循环变量的初始化。,2023/11/7,47,几种循环的比较,(4)while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环(break语句和continue语句见下节)。而对用goto语句和if语句构成的循环,不能用break语句和continue语句进行控制。,2023/11/7,48,break语句和continue语句,break语句 break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句 一般形式:break;注意:break语句不能用于循环语句和switch语句之外的任何其他语句中。,2023

21、/11/7,49,break语句和continue语句,例:float pi=3.14159;for(r=1;r100)break;printf(r=%f,area=%fn,r,area);,程序的作用是计算r=1到r=10时的圆面积,直到面积area大于100为止。从上面的for循环可以看到:当area100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环。,2023/11/7,50,break语句和continue语句,continue语句 作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定.一般形式:continue;,2023/11

22、/7,51,break语句和continue语句,continue语句和break语句的区别:continue语句只结束本次循环,而不是终止整个循环的执行。,while(表达式1)for if(表达式2)continue;0,2023/11/7,52,break语句和continue语句,continue和break的区别 break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,while(表达式1)for if(表达式2)break;,2023/11/7,53,六、数组的定义和引用1.一维数组和二维数组的定义、初始化和数组元素的引用。2.字符串与字符数组。,2023/11/7,

23、54,一维数组,例如:int a10;float score5;“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。,一维数组的定义,数据类型 数组名常量表达式;,2023/11/7,55,以下数组定义是正确的:#define N 10float score1N,score2N;int num10+N;char c26;,以下数组定义是不正确的:int array(10);int n;float scoren;double ba.d;char str;,一维数组的定义,2023/

24、11/7,56,数组元素的引用,格式:,例如:输入学生成绩 for(i=0;i5;i+)scanf(%f,例如:fibn=fibn-1+fibn-2;,下标表达式的值必须是整型表达式。,数组名下标表达式,2023/11/7,57,一维数组的初始化,初始化:在定义数组时给数组元素赋初值。,1在定义数组时,对全部数组元素赋初值 例如:int a5=0,1,2,3,4;此时可以省略数组长度,例如:int a=0,1,2,3,4;2在定义数组时,对部分数组元素赋初值 例如:int a5=1,2,3;系统为其余元素赋 0。3当初值的个数多于数组元素的个数时,编译出错 例如:int a5=0,1,2,3,

25、4,5;,2023/11/7,58,二维数组,数据类型 数组名常量表达式1常量表达式2;,例如:float x23;,二维数组的定义,int a3,4,b(3,4),c,d(3)(4);,2023/11/7,59,x0是数组名,是元素x00的地址,x1是数组名,是元素x10的地址,二维数组可看作是一种特殊的一维数组,x0-x00,x01,x02,x1-x10,x11,x12,例如,可以把x数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素一维数组。,2023/11/7,60,a34=3;/*下标越界*/a1,2=1;/*应写成 a12=1;*/,二维数组元素的引用,例:int a3

26、4;a00=3;a01=a00+10;,数组名行下标表达式列下标表达式,数组元素的表示形式:,2023/11/7,61,二维数组的初始化,例:int a23=1,2,3,4,5,6;,1按行赋初值,例:int a23=1,2,3,4,5,6;初始化后结果:1 2 3 4 5 6,2按数组元素在内存中排列的顺序对各元素赋初值,3给部分元素赋初值,例:int a23=1,4;初始化后结果:1 0 0 4 0 0,2023/11/7,62,二维数组的初始化,4数组初始化时,行长度可省,列长度不能省 例如:int a3=1,2,3,4,5,6,7;int b4=1,4,5;初始化结果:,a 结果:a0

27、:1 2 3 a1:4 5 6a2:7 0 0,b 结果:b0:1 0 0 0b1:4 5 0 0,2023/11/7,63,下面对二维数组的定义都是错误的:,二维数组的初始化,float x3=1.0,2.0,3.0,4.0,5.0,6.0;,int a,b 2,c3;,int m24=1,2,3,4,5,6,7,8,9;/*编译出错,初值个数多于数组元素的个数*/,2023/11/7,64,二维数组应用举例,【例7.2】给一个4行3列的二维数组输入/出数据。main()int a43,i,j,k;for(i=0;i4;i+)for(j=0;j3;j+)scanf(%d,程序运行情况如下:1

28、 2 34 5 67 8 910 11 121 2 34 5 67 8 910 11 12,2023/11/7,65,字符数组,字符数组:可以存放若干个字符,也可以存放字符串。,基本概念,字符串:字符串的末尾必须有0字符,它的ASCII码值为0。,不是字符串,是字符串,2023/11/7,66,再例如:char a35;a数组是一个二维的字符数组,可以存放15个字符或3个长度不大于4的字符串。,字符数组的定义,例如:char s10;s数组是一维字符数组,它可以存放10个字符或一个长度不大于9的字符串。,注意:字符串只能存放在字符数组中。,2023/11/7,67,字符数组的初始化,1用字符常

29、量赋初值例如:char c5=C,h,i,n,a;,再例如:char c6=C,h,i,n,a,0;,是字符串,不是字符串,2023/11/7,68,字符数组的初始化,再例如:char a310=basic,pascal,c;,2用字符串常量赋初值,例如:char str10=a string;或char str10=a string;,是字符串吗?,2023/11/7,69,字符数组的初始化,例如:char s37=s,t,r,i,n,g;,3初始化时长度的省略,例如:char s1=Good morning!;,b0,b13,例如:char s2=s,t,r,i,n,g;,思考:哪个数组存

30、放的是字符串,?,2023/11/7,70,程序如下:,main()char c110,c226;int i;for(i=0;i10;i+)c1i=i+48;for(i=0;i26;i+)c2i=i+A;for(i=0;i10;i+)printf(%c,c1i);printf(n);for(i=0;i26;i+)printf(%c,c2i);printf(n);,2023/11/7,71,2对字符数组的整体引用,输出字符串例如:char c=China;printf(%s,c);输出结果为:China,C是数组首地址,输出时遇 0 为止,再例如:char c=pascal0basic;prin

31、tf(%s,c);输出结果为:pascal,2023/11/7,72,2对字符数组的整体引用,输入字符串例如:char c10;scanf(%s,c);输入:beijing,三个字符串用空格隔开作为串结束的标志,分别赋给str1、str2、str3三个数组。,再例如:char str110,str210,str310;scanf(%s%s%s,str1,str2,str3);输入:pascal basic c,注意:不可以为数组整体赋值,例如:char c10;c=beijing;因为c是数组首地址,是常量!,2023/11/7,73,七、函数1.库函数的正确调用。2.函数的定义方法。3.函数

32、的类型和返回值。4.形式参数与实在参数,参数值传递。5.函数的正确调用,嵌套调用,递归调用。6.局部变量和全局变量。7.变量的存储类别(自动,静态,寄存器,外部),变量的作用域和生存期。,2023/11/7,74,函数概述,使用函数的好处:程序结构清晰,可读性好。减少重复编码的工作量。可多人共同编制一个大程序,缩短程序设计周期,提高程序设计和调试的效率。,2023/11/7,75,一个C源程序可以由一个或多个源程序文件组成。C编译系统在对C源程序进行编译时是以文件为单位进行的。一个C源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。在一个C程

33、序中,有且仅有一个主函数main。C程序的执行总是从main函数开始,调用其它函数后最终回到main函数,在main函数中结束整个程序的运行。,说明,2023/11/7,76,函数的种类,从使用的角度看:标准函数(库函数)库函数是由系统提供的。如:getchar()、sin(x)等。在程序中可以直接调用它们。附录A列出了C的部分库函数。用户自定义函数。如:例7.1中的cube函数。,从函数定义形式分:有参函数:在主调(用)函数和被调(用)函数之间通过参数进行数据传递,如:int cube(int x)无参函数:如:getchar()在调用无参函数时,主调函数不需要将数据传递给无参函数。,202

34、3/11/7,77,函数的定义,函数定义的一般形式,函数类型 函数名(类型名 形式参数1,)说明语句 执行语句,例如:求两个数的最大值。int max(int x,int y)int z;z=x y?x:y;return(z);,类型省略时默认为int类型,2023/11/7,78,int max(x,y)int x,y;int z;z=x y?x:y;return(z);,int max(x,y)int x,y;或int max(int x,y),或int max(x,y)int x,y,z;z=x y?x:y;return(z);,花括号中也可以为空,这种函数叫空函数。不能在函数体内定义其

35、他函数,即函数不能嵌套定义。,形参也可以这样定义,2023/11/7,79,函数名(实参表列),在C语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。例如:welcome();if(iabs(a)max)max=iabs(a);m=max(c,max(a,b);,函数的调用,函数调用的一般形式:,2023/11/7,80,void swap(int x,int y)int z;z=x;x=y;y=z;printf(nx=%d,y=%d,x,y);main()int a=10,b=20;swap(a,b);printf(na=%d,b=%dn,a,b);,函数参

36、数与函数的返回值,1函数的形式参数与实际参数,程序输出结果:x=20,y=10a=10,b=20,形式参数(形参),实际参数(实参),【例7.4】编一程序,将主函数中的两个变量的值传递给swap函数中的两个形参,交换两个形参的值。,单向值传递,2023/11/7,81,有关形参和实参的说明:,当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。实参可以是常量、变量或表达式,但要求它们有确定的值。实参与形参类型要一致,字符型与整型可以兼容。实参与形参的个数必须相等。在函数调用时,实参的值赋给与之相对应的形参。“单向值传递”。,注意:在TC中,实参的求值顺序是从右到左。,2023/11/

37、7,82,函数的返回值是通过return语句带回到主调函数的,功能:终止函数的运行,返回主调函数,若有返回值,将返回值带回主调函数。,说明:若函数没有返回值,return语句可以省略。return语句中的表达式类型一般应和函数的类型一致,如果不一致,系统自动将表达式类型转换为函数类型。,函数的返回值,return 语句格式:,return(表达式);或 return 表达式;或 return;,2023/11/7,83,对被调函数的声明和函数原型,变量要先定义后使用,函数也如此。即被调函数的定义要出现在主调函数的定义之前。如swap函数:允许整型函数(且参数也是整型)的定义出现在主调函数之后。

38、如max函数:如果非整型函数在主调函数之后定义,则应在主调函数中或主调函数之前对被调函数进行声明。,void swap(int x,int y)main()swap(a,b);,main()c=max(a,b);max(int x,int y),2023/11/7,84,对被调函数进行声明的一般形式,函数类型 函数名(参数类型1 参数名1,);或 函数类型 函数名(参数类型1,参数类型2,);,思考:以下哪种情况需要在主调函数中对被调函数声明被调函数定义在前,主调函数定义在后。主调函数定义在前,被调函数定义在后,且被调函数的类型不是整型的。被调函数定义在后,但被调函数的类型是整型。,第二种形式

39、省略了参数名,此种形式也称为函数的原型。,?,2023/11/7,85,函数的嵌套调用,函数嵌套调用:函数调用中又存在调用。如函数1调用函数2,函数又调用函数3。函数之间没有从属关系,一个函数可以被其它函数调用,同时该函数也可以调用其它函数。,2023/11/7,86,函数的递归调用,函数的递归调用:是指函数直接调用或间接调用自己,或调用一个函数的过程中出现直接或间接调用该函数自身。前者称为直接递归调用,后者称为间接递归调用。,2023/11/7,87,局部变量和全局变量及其作用域,1.变量的作用域,2.局部变量及其作用域,变量的作用域:变量在程序中可以被使用的范围。根据变量的作用域可以将变量

40、分为局部变量和全局变量。,局部变量(内部变量):在函数内或复合语句内定义的变量以及形参。作用域:函数内或复合语句内。,问题:一个变量在程序的哪个函数中都能使用吗?,2023/11/7,88,全局变量及其作用域,全局变量(外部变量):在函数外部定义的变量。作用域:从定义变量的位置开始到本源文件结束。如在其作用域内的函数或分程序中定义了同名局部变量,则在局部变量的作用域内,同名全局变量暂时不起作用。,2023/11/7,89,变量的存储类别及变量的生存期,1.变量的生存期与变量的存储分类,变量的生存期:变量在内存中占据存储空间的时间。,思考:1.何时为变量分配内存单元?2.将变量分配在内存的什么区

41、域?3.变量占据内存的时间(生存期)?,动态存储变量,静态存储变量,2023/11/7,90,变量的存储类别,变量的属性,数据类型:决定为变量分配内存单元的长度,数据的存放形式,数的范围。,存储类别:决定了变量的生存期,给它分配在哪个存储区。,2023/11/7,91,变量定义语句的一般形式,存储类别 数据类型 变量名1,变量名n;,auto(自动的)register(寄存器的)static(静态的)extern(外部的),1自动变量(auto类别)局部变量可以定义为自动变量。,2023/11/7,92,内存分配调用函数或执行分程序时在动态存储区为其分配存储单元,函数或分程序执行结束,所占内存

42、空间即刻释放。变量的初值定义变量时若没赋初值,变量的初值不确定;如果赋初值则每次函数被调用时执行一次赋值操作。生存期 在函数或分程序执行期间。作用域自动变量所在的函数内或分程序内。,自动变量,2023/11/7,93,2静态变量(static类别),除形参外,局部变量和全局变量都可以定义为静态变量。,2023/11/7,94,int c;static int a;main()float x,y;char s;f()static int b=1;,3.外部变量(extern类别),在函数外定义的变量若没有用 static说明,则是外部变量。外部变量只能隐式定义为extern类别,不能显式定义。,

43、2023/11/7,95,内存分配编译时,将其分配在静态存储区,程序运行结束释放该单元。变量的初值若定义变量时未赋初值,在编译时,系统自动赋初值为0。生存期整个程序的执行期间。作用域从定义处开始到本源文件结束。此外,还可以用extern进行声明,以使其作用域扩大到该程序的其它文件中。,外部变量,问题:全局静态变量的作用域可以扩展到本程序的其它文件吗?,2023/11/7,96,外部变量声明的一般格式,extern 数据类型 变量名1,变量名n;或 extern 变量名1,变量名n;,注意:外部变量声明用关键字extern,而外部变量的定义不能用extern,只能隐式定义。定义外部变量时,系统要

44、给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。,2023/11/7,97,4.寄存器变量(register类别),只有函数内定义的变量或形参可以定义为寄存器变量。寄存器变量的值保存在CPU的寄存器中。受寄存器长度的限制,寄存器变量只能是char、int和指针类型的变量。,【例7.26】寄存器变量的使用。main()long int sum=0;register int i;for(i=1;i=1000;i+)sum+=i;printf(sum=%ldn,sum);,程序输出结果:sum=500500,202

45、3/11/7,98,归纳变量的分类,1按照变量的作用域对变量分类 局部变量 全局变量2按照变量的生存期对变量分类 静态存储变量包括:局部静态变量和全局静态变量 动态存储变量包括:自动变量,2023/11/7,99,八、编译预处理1.宏定义和调用(不带参数的宏,带参数的宏)。2.“文件包含”处理。,2023/11/7,100,预处理命令,语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。,2023/11/7,101,宏定义,用标识符来代表一个字符串(给字符串取个名字)。C语言用“#define”进行宏定义。

46、C编译系统在编译前将这些标识符替换成所定义的字符串。宏定义分为不带参数的宏定义和带参数宏定义。1不带参数的宏(1)一般形式 定义格式:#define 标识符 字符串 宏名遵循标识符规定,习惯用大写字母表示,以便区别普通的变量。#define之间不留空格,宏名两侧空格(至少一个)分隔。宏定义字符串不要以分号结束,否则分号也作为字符串的一部分参加展开。从这点上看宏展开实际上是简单的替换。,2023/11/7,102,宏定义,(2)几点说明宏定义用宏名代替一个字符串,并不管它的数据类型是什么,也不管宏展开后的词法和语法的正确性,只是简单的替换。是否正确,编译时由编译器判断。#define宏定义宏名的

47、作用范围从定义命令开始直到本源程序文件结束。可以通过#undef终止宏名的作用域。宏定义中,可以出现已经定义的宏名,还可以层层置换。宏名出现在双引号“”括起来的字符串中时,将不会产生宏替换。(因为出现在字符串中的任何字符都作为字符串的组成部分)宏定义是预处理指令,与定义变量不同,它只是进行简单的字符串替换,不分配内存。,2023/11/7,103,宏定义,例1不带参数的宏#define PI 3.14main()float r=3,s,c;s=PI*r*r;c=2*PI*r;printf(r,s,c);,2023/11/7,104,宏定义,2带参数的宏(1)一般形式 定义格式:#define

48、宏名(参数表)字符串(2)几点说明 正因为带参宏定义本质还是简单字符替换(除了参数替换),所以容易发生错误。为了避免出错,建议将宏定义“字符串”中的所有形参用括号()括起来。以后,替换时括号作为一般字符原样照抄,这样用实参替换时,实参就被括号括起来作为整体。不至于发生类似错误。定义带参数宏时还应该注意宏名与参数表之间不能有空格。有空格就变成了不带参数的宏定义。,2023/11/7,105,宏定义,带参数的宏定义在程序中使用时,它的形式及特性与函数相似,但本质完全不同。许多问题可以用函数也可以用带参数的宏定义。宏占用的是编译时间,函数调用占用的是运行时间。在多次调用时,宏使得程序变长,而函数调用

49、不明显。,2023/11/7,106,“文件包含”处理,(1)一般形式#include“文件名”或#include(2)几点说明 被包含的文件常常被称为“头文件”(#include一般写在模块的开头)。头文件常常以“.h”为扩展名(也可以用其它的扩展名,.h只是习惯或风格)。一条#include只能包含一个头文件,如果要包含多个头文件,使用多条#include命令。被包含的头文件可以用“”括起来,也可以用括起来。区别在于:先在C系统目录中查找头文件,“”先在用户当前目录查找头文件。习惯上,用户头文件一般在用户目录下,所以常常用“”;系统库函数的头文件一般在系统指定目录下,所以常常用。,2023

50、/11/7,107,九、指针1.地址与指针变量的概念,地址运算符与间址运算符。2.一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义。通过指针引用以上各类型数据。3.用指针作函数参数。4.返回地址值的函数。5.指针数组,指向指针的指针。,2023/11/7,108,一、指针概述,1、指针和指针变量指针即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。(2)指针变量专门用于存储其它变量地址的变量 指针变量num_pointer的值就是变量num的地址。指针与指针变量的区别,就是变量值与变量的区别。,2023/11/7,109,2、直接访问和间

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号