C语言考试复习要点.ppt_第1页
C语言考试复习要点.ppt_第2页
C语言考试复习要点.ppt_第3页
C语言考试复习要点.ppt_第4页
C语言考试复习要点.ppt_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言考试复习要点 n3.1 数据类型 n数据类型总表 C 数 据 类 型 基本类型 构造类型 指针类型 空类型void 定义类型typedef 字符类型char 枚举类型enum 整 型 实型 单精度型float 双精度型double 数组 结构体struct 共用体union 短整型short 长整型long 整型int 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作 n基本数据类型 类型符号关键字数的表示范围所占位数 整型字符型实型 有 无 (signed)int16 -3276832767 (signed)short16 -3276832767 (signed)long 32 -21474836482147483647 16unsigned int 065535 32 04294967295unsigned long unsigned short16 065535 有float 32 3.4e-383.4e38 有double641.7e-3081.7e308 有char 8-128127 无unsigned char80255 说明:数据类型所占字节数随机器硬件不同而不同,上表以IBM PC机为例: n3.2 常量与变量 n标识符 n定义:用来标识变量、常量、函数等的字符序列 n组成: n只能由字母、数字、下划线组成,且 第一个字母必须是字母或下划线 n大小写敏感 n不能使用关键字 n长度:最长32个字符 n命名原则: n见名知意 n不宜混淆 如l与I, o与0 例:判断下列标识符号合法性 sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char ab _above $123 M.D.John3days #33 char$123ab 编译程序根据变量定义为其 分配指定字节的内存单元 . 地址 int a=1, b=-3,c; a b c 2字节 2字节 2字节 地址 地址 . 内存 1 -3 随机数 n变量 n概念:其值可以改变的量 n变量名与变量值 n变量定义的一般格式: 数据类型 变量1,变量2,变量n; n变量初始化:定义时赋初值 例: int a,b,c; float data; 决定分配字节数 和数的表示范围 合法标识符例: int a=2,b,c=4; float data=3.67; char ch=A; int x=1,y=1,z=1; int x=y=z=1; n变量的使用:先定义,后使用 例1 int student; stadent=19; /Undefined symbol statent in function main 例2 float a,b,c; c=a%b; /Illegal use of floating point in function main n变量定义位置:一般放在函数开头 main() int a,b=2; float data; a=1; data=(a+b)*1.2; printf(“data=%fn”,data); 变量定义 可执行语句 main() int a,b=2; a=1; float data; data=(a+b)*1.2; printf(“data=%fn”,data); double b; a=111111.111; /* a=111111.1*/ b=111111.111; /* b=111111.111*/ 例 a=D; /* a=68; */ x=A+5; /* x=65+5; */ s=!+G /* s=33+71; */ 没有字符串变量,用字符数组存放 n3.7各类数值型数据间的混合计算 n运算转换规则:不同类型数据运算时先自动转换成 同一类型。 n隐式转换(自动转换) n运算转换-不同类型数据 混合运算时 n赋值转换-把一个值赋给 与其类型不同的变量时 n输出转换-输出时转换成 指定的输出格式 n函数调用转换-实参与形 参类型不一致时转换 n学习运算符应注意: n运算符功能 n与运算量关系 n要求运算量个数 n要求运算量类型 n运算符优先级别 n结合方向 n结果的类型 n自增、自减运算符+ - n作用:使变量值加1或减1 n种类: n前置 +i, -i (先 执行i+1或i-1,再使用i值) n后置 i+,i- (先 使用i值,再执行i+1或i-1) 例 j=3; k=+j; j=3; k=j+; j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b; /k=4,j=4 /k=3,j=4 /4 /3 /c=20,a=4 /c=15,a=4 n自增、自减运算符+ - n作用:使变量值加1或减1 n种类: n前置 +i, -i (先 执行i+1或i-1,再使用i值) n后置 i+,i- (先 使用i值,再执行i+1或i-1) n说明: n+ - 不能用于常量和表达式 ,如5+,(a+b)+ n+ -结合方向: 自右向左 n优先级:- + - -* / % -+ - (2) (3) (4) 例 -i+ -(i+) i=3; printf(“%d”,-i+); /-3 例 j+k; (j+)+k; 例 -i+ i=3; printf(“%d”,-i+); n赋值运算符和表达式 n简单赋值运算符 n符号: = n格式: 变量标识符=表达 式 n作用:将一个数据(常量或 表达式)赋给一个变量n复合赋值运算符 n种类:+= -= *= /= %= = = d=func(); c=d+2; n逗号运算符和表达式 n形式:表达式1,表达式2,表达式n n结合性:从左向右 n优先级: 15 n逗号表达式的值:等于表达式n的值 n用途:常用于循环for语句中 例 a=3*5,a*4 a=3*5,a*4,a+5 例 x=(a=3,6*3) x=a=3,6*a 例 a=1;b=2;c=3; printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c); /a=15,表达式值60 /a=15,表达式值20 /赋值表达式,表达式值18,x=18 /逗号表达式,表达式值18,x=3 /1,2,3 /3,2,3 第4章 最简单的C程序设 计 顺序程序设 计 n输入语句 n赋值语句 n输出语句 4. 复合语句:把多个语句用括号 括起来组成的一个语句称复合语句。 在程序中应把复合语句看成是单条语句,而 不是多条语句。 例如: x=y+z; a=b+c; printf(“%d%d”,x,a); 是一条复合语句。 复合语句内的各条语句都必须以分号“;”结尾 ,在括号“”外不能再加分号。 在赋值语句的使用中需要注意以下几 点: 3. 在变量说明中,不允许连续给 多个变量赋初值。 如下述说明是错误的: int a=b=c=5; /* 此句是错误写法*/ 必须写为 int a=5,b=5,c=5; 而赋值语句允许连续赋值,写成下面两句也是正确的 int a,b,c; a=b=c=5; 格式:printf(“格式控制串”,输出表) 功能:按指定格式向显示器输出数据 返值:正常,返回输出字节数;出错,返回EOF(-1) n格式输出函数 n输出表:要输出的数据(可以没有,多个时以“,”分隔) n格式控制串:包含两种信息 n格式说明: %修饰符格式 字符 ,用于指定输出格式 n普通字符或转义序列:原样输 出 n格式字符 只有9个:d、o、x、u、c、s、f、e、g,每个格式 说明都是以其中一个结尾 如: printf(“c=%cf=%fs=%s”,c,f,s); n附加格式说明符(修饰符) .n 对实数,指定小数点后位数 对字符串,指定实际输出位数 修饰符功 能 m 输出数据域宽,数据长度c-d,x3/2,a+1bc,a!=c=d等。 关系表达式自身的值是逻辑量,但在C语言中是用数字1和0 来代替的。1代表“真”(“成立”),0代表“假” (“不成立”)。在 关系表达式嵌套的情况中也是按这个规则来处理的。 例:a=3,b=2,c=1 ab 为真,此表达式的值为1 ab=c 为真,此表达式的值为1 b+cbc ? 若a=0; b=0.3; c=0.5; aba ? 语言中提供了三种逻辑运算符: n printf(“n input two numbers:“); scanf(“%d%d“, max=a; if (maxb) printf(“max=%dn“,a); else printf(“max=%dn“,b); 第三种形式为if-else-if形式 前二种形式的if语句一般都用于两个分 支的情况。当有多个分支选择时,可采用if- else-if语句,其一般形式为: if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; else if(表达式m) 语句m; else 语句n; 其语义是:依次判断表达式的值,当出 现某个值为真时,则执行其对应的语句。然 后跳到整个if语句之外继续执行程序。 如果 所有的表达式均为假,则执行语句n。然后 继续执行后续程序。 5.3.1 if语句的三种形式 expr1 statemnt1 非0 =0 expr2 expr3 statemntnstatemnt3statemnt2 非0 非0 =0 =0 #include“stdio.h“ main() char c; printf(“input a character: “); c=getchar(); if(c=0 else printf(“%f”,-x); n 在if语句的三种形式中,所有的语句应为单个语句, 如果要想在满足条件时执行一组(多个)语句,则必须把 这一组语句用括起来组成一个复合语句。但要注意的 是在之后不能再加分号。 例如: if(ab) a+; b+; else a=0; b=10; 在使用if语句中还应注意以下问题: 5.3.2 if语句的嵌套 当 if 语句中的执行语句又是 if 语句时,则构成了if 语句嵌套的情形。 其一般形式可表示如下: if(表达式1) if(表达式2) 语句1 else 语句2 else if(表达式3) 语句3 else 语句4 上面的三个IF语句都可以是不完整的,但那时候要注 意 if 和 else 的配对问题。 if 和 else 的配对原则 if(表达式1) if(表达式2) 语句1; else 语句2; 其中的else究竟是与哪一个 if 配对呢? if(表达式1) if(表达式2) 语句1; else 语句2; if(表达式1) if(表达式2) 语句1; else 语句2; if(表达式1) if(表达式2) 语句1; else 语句2; 为了避免这种二义性, 语言规定,else 总是与它 前面最近的 if 配对,因此 对上述例子应按前一种情 况理解。 6.1 循环语句概述 循环结构是程序中一种很重要的结构。其特 点是,在给定条件成立时,反复执行某程序段 ,直到条件不成立为止。给定的条件称为循环 条件,反复执行的程序段称为循环体。语言 提供了多种循环语句,可以组成各种不同形式 的循环结构。 1.用goto语句和if语句构成循环; 2.用while语句; 3.用do-while语句; 4.用for语句; 6.3 while语句 while语句的一般形式为 : while(表达式)语句 其中表达式是循环条件 ,语句为循环体。 while语句的语义是: 计算表达式的值,当值为真 (非0)时, 执行循环体语句 。其执行过程可用下图表示 。 条件 循环体 假(0) 真(非0) while n特点:先判断表达式,后执行循环体 n说明: n循环体有可能一次也不执 行 n循环体可为任意类型语句 n下列情况,退出while循环 n条件表达式不成 立(为零) n循环体内遇 break,return,goto n无限循环: while(1) 循环体; 6.3 while语句 【例6.2】用while语句构成循环,求1到100 的和。 6.3 while语句 main() int i,sum=0; i=1; while(i100)使循环结束。 使用while语句应注意以下几点: 6.4 do-while语句 do-while语句的一般形式 为: do 语句 while(表达式); 这个循环与while循环 的不同在于:它先执行循环 中的语句,然后再判断表达 式是否为真, 如果为真则 继续循环;如果为假, 则 终止循环。因此, do-while 循环至少要执行一次循环 语句。其执行过程可用右 图表示。 do 循环体 条件 假(0) 真(非0) while n特点:先执行循环体,后判断表达式 n说明: n至少执行一次循环体 ndowhile可转化成while结构 6.4 do-while语句 条件 循环体 假(0) 真(非0) 循环体 While循环 do-while循环 【例6.3】用do-while语句求1到100的和。 6.4 do-while语句 main() int i,sum=0; i=1; do sum= sum+i; i+; while(i main() int i,c; for(i=0;(c=getchar()!=n;i+=c); printf(“%dn“,i); 运行结果: ABC 198 #include main() int c; for(;(c=getchar()!=n;) printf(“%c“,c); 运行结果: computer computer 6.6 循环的嵌套 n三种循环可互相嵌套,层数不限 n外层循环可包含两个以上内循环,但不能相互交叉 n嵌套循环的执行流程 n嵌套循环的跳转 n禁止: n从外层跳入内层 n跳入同层的另一循环 n向上跳转 (1) while() while() . (2) do do while( ); . while( ); (3) while() do while( ); . (4) for( ; ;) do while(); while() . 内循环 外循环 内循环 main() int i=1,j; while(i100) break; printf(“%.2fn”,area); 6.8.2 continue 语句 continue语句的作用是跳过本次循环中剩余的 语句而强行执行下一次循环。continue语句只用在 for、while、do-while等循环体中,常与if条件语句 一起使用,用来加速循环。其执行过程可用下图表 示。 条件 continue; 假(0) 真(非0) while 真(非0) do continue; . 条件 假(0) while 条件2 continue; . 假(0) 真(非0) for 表达式1 表达式3 数组概述 n在程序设计中,为了处理方便,把具有相同 类型的若干变量按有序的形式组织起来。这些 按序排列的同类数据元素的集合称为数组。 n在语言中,数组属于构造数据类型。 n一个数组可以分解为多个数组元素,这 些数组元素可以是基本数据类型或是构造 类型。 n按数组元素的类型不同,数组又可分为 数值数组、字符数组、指针数组、结构数 组等各种类别。本章介绍数值数组和字符 数组,其余的在以后各章陆续介绍。 内存操作: int a6; 7.1 一维数组的定义和引用 a0 0 1 4 5 a1 a2 a3 a4 a5 2 3 a 编译时分配连续内存 内存字节数=数组元素个数*该类 型数据长度 数组名表示内存首地址 ,a就成了地址常量 n对于数组类型说明应注意以下几点: 7.1 一维数组的定义和引用 1.数组的类型实际上是指数组元素的取值类型。对于 同一个数组,其所有元素的数据类型都是相同的。 2.数组名的书写规则应符合标识符的书写规定。 和变 量名的要求相同。 3.数组名不能与其它变量名相同。 例如: main() int a; float a10; 是错误的。 4.方括号中常量表达式表示数组元素的个数,如a5 表示数组a有 5个元素。但是其下标从0开始计算。因此 5个元素分别为a0,a1,a2,a3,a4,没有a5。 5.不能在方括号中用变量来表示元素的个数,但是可以 是符号常数或常量表达式。 例如: #define FD 5 main() int a3+2,b7+FD; 是合法的。 但是下述说明方式是错 误的。 main() int n=5; int an; 6.允许在同一个类型说明中,说明多个数组和多个变量 。 int a,b,c,d,k110,k220; 是合法的 数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在语言中只能逐个地使用下标变 量,而不能一次引用整个数组。 一维数组元素的引用 例如 输出有10个元素的数组a必须使用循环语句逐个输出各下标变量: int a10; for(i=0; ia1),则交换;然后比较第二个数与第三个数,并视情 况决定是否交换;依次类推,直至第n-1个数和第n个数(最后 一个数)比较为止第一趟沉底排序,结果最大的数被安置 在最后一个元素的位置上。 (2)对前n-1个数进行第二趟沉底排序(最后那个最大的数就不再 参加了),结果使次大的数被安置在第n-1个(倒数第二个)元 素的位置上。 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束。 简单选择法排序 排序过程(以10个数排成前小后大为例) : (1)首先通过n-1次比较,从n个数中找出最小的(将最小元素的下标 存在另一个变量中),将最小元素与第一个元素交换第一趟选 择排序,结果最小的数被安置在第一个元素的位置上。 (2)再通过n-2次比较,从剩余的后n-1个数中找出最小的元素(也就 是所有n个数中次小的),将它与第二个数交换第二趟选择排序 。 (3)重复上述过程,共经过n-1趟排序后,排序结束。 数组元素的存 放顺序 7.2.1 二维数组的定义 二维数组在概念上是二维的,即是说其下二维数组在概念上是二维的,即是说其下 标在两个方向上变化,下标变量在数组中的标在两个方向上变化,下标变量在数组中的 位置也处于一个平面之中。但是,实际的硬位置也处于一个平面之中。但是,实际的硬 件存储器却是连续编址的,也就是说存储器件存储器却是连续编址的,也就是说存储器 单元是按一维线性排列的。如何在一维存储单元是按一维线性排列的。如何在一维存储 器中存放二维数组。器中存放二维数组。在语言中,二维数组在语言中,二维数组 是按行序优先排列的。是按行序优先排列的。 int a32 a01 a10 a11 a20 a21 0 1 4 5 2 3 a00 a00 a01 a10 a11 a20 a21 int c234 0 1 2 3 4 5 6 7 . 20 21 22 23 c000 c001 c002 c003 c010 c011 c012 c013 c020 c021 c022 c023 c100 c101 c102 c103 c110 c111 c112 c113 c120 c121 c122 c123 多维数组:最右 边的下标变化最 快 二维数组的初始化的说明 n正常的全部初始 化: 例 int a23=1,2,3,4,5,6; a00 a01 a02 a10 a11 a12 123456 全部初始化 例 int a23=1,2,3,4,5,6; a00 a01 a02 a10 a11 a12 123456 全部初始化 n部分初始化: 例 int a23=1,2,4; a00 a01 a02 a10 a11 a12 124000 部分初始化 例 int a23=1,2,4; a00 a01 a02 a10 a11 a12 120400 部分初始化 n第一维长度省略初始 化: 例 int a3=1,2,3,4,5; a00 a01 a02 a10 a11 a12 123450 第一维长度省略初始化 例 int a3=1,4,5; a00 a01 a02 a10 a11 a12 100450 第一维长度省略初始化 二维数组和一维数组的关系 数组是一种构造类型的数据。二维数组可以看作是由一维数 组的嵌套而构成的。设一维数组的每个元素都又是一个一维数组 ,就组成了二维数组。当然,前提是各元素类型必须相同。根据 这样的分析,一个二维数组也可以分解为多个一维数组。语言 允许这种分解。 例 int a34; 2016 17 2018 19 2020 21 2022 23 2008 9 2010 11 2012 13 2014 15 2000 1 2002 3 2004 5 20006 7 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 每个元素ai由包含4个元素 的一维数组组成 二维数组a是由3个元素组成 行名 a0 a1 a2 0 1 4 5 2 3 a01 a02 a03 a10 a11 a00 a13 a20 a21 a22 a23 a12 6 7 10 11 8 9 a0 a1 a2 当对全体元素赋初值时也可以省去长度说明。 例如: char c=c, ,p,r,o,g,r,a,m; 这时C数组的长度自动定为9。 例 char ch5=B,o,y; ch0 Boy00 逐个字符赋值 ch1ch2ch3ch4 若字符个数少于数组长度,则后面元素的都赋为“空字符”。 7.3.2 字符数组的初始化 7.3.4 字符串和字符串结束标志 在语言中没有专门的字符串变量,通常用一个字符数组 来存放一个字符串。前面介绍字符串常量时,已说明字符串 总是以0作为串的结束符。因此当把一个字符串存入一个数 组时,也把结束符0存入数组,并以此作为该字符串是否结 束的标志。有了0标志后,就不必再用字符数组的长度来判 断字符串的长度了。 语言允许用字符串的方式对数组作初始化赋值。 例 char ch6=“Hello”; char ch6=“Hello”; char ch=“Hello”; 用字符串常量 ch0 Hello ch1ch2ch3ch4 0 ch5 例 char ch5=“Boy”; ch0 Boy00 用字符串常量 ch1ch2ch3ch4 0是由C编译系统自动加上的 。由于采用了0标志,所以在 用字符串赋初值时一般无须指 定数组的长度, 而由系统自行 处理。 7.3.5 字符数组的输入输出 在采用字符串方式后,字符数组的输入输出将变得简单方 便。 除了上述用字符串赋初值的办法外,还可用printf函数和 scanf函数一次性输出输入一个字符数组中的字符串,而不必 使用循环语句逐个地输入输出每个字符。 逐个字符I/O: %c 整个字符串I/O: %s 例 用%c main() char str5; int i; for(i=0;iy?x:y; return(z); main() int a,b,c; scanf(“%d,%d“, c=max(a,b); printf(“Max is %d“,c); max(int x, int y) int z; z=xy?x:y; return(z); 形参 实参 关于形参和实参的说明: n形参变量只有在被调用时才临时分配内存单元,在 调用结束时,即刻释放所分配的内存单元。因此,形参 只有在函数内部有效。函数调用结束返回主调函数后则 不能再使用该形参变量。 n实参可以是常量、变量、表达式、函数等,无论实 参是何种类型的量,在进行函数调用时,它们都必须具 有确定的值,以便把这些值传送给形参。因此应预先用 赋值,输入等办法使实参获得确定值。 n实参和形参在数量上、顺序上应严格一致,否则会 发生类型不匹配的错误。若类型上不一致,自动按形参 类型转换函数调用转换 n函数调用中发生的数据传送是单向的。即只能把实 参的值传送给形参,而不能把形参的值反向地传送给实 参。实参和形参在内存中占用的是不同的单元,因此在 函数调用过程中,形参的值发生改变,而实参中的值不 会变化。 n参数传递方式 n值传递方式(一般变量或下标变量作参数) n方式:函数调用时,为形参分配 单元,并将实参的值复制到形参中;调用结束,形 参单元被释放,实参单元仍保留并维持原值 n特点: n形参与实参占用不同 的内存单元 n单向传递 8.3 函数的参数和函数的值 2.地址传递(数组或指针作参数) 参数值传递举例 n例 交换两 个数 /*ch7_2.c*/ #include main() int x=7,y=11; printf(“x=%d,ty=%dn“,x,y); printf(“swapped:n“); swap(x,y); printf(“x=%d,ty=%dn“,x,y); swap(int a,int b) int temp; temp=a; a=b; b=temp; 711x:y:调用前: 调用结束: 711x:y: 调用: 711a:b: 711x:y: swap: 711x:y: 117a:b: temp 8.4 函数的调用 8.4.1 函数调用的一般形式 前面已经说过,在程序中是通过对函数的调用来执行函数体的,其 过程与其它语言的子程序调用相似。 语言中,函数调用的一般形式为: 函数名(实际参数表) 对无参函数调用时则无实际参数表,但括号不能省。实际参数表中的 参数可以是常数,变量或其它构造类型数据及表达式。各实参之间用逗 号分隔。 说明: 1. 实参与形参个数相等,类型一致,按顺序一一对应。 2. 实参表求值顺序,因系统而定(Turbo C 自右向左)。 8.4.3 被调用函数的声明和函数原 型 n在主调函数中调用某函数之前应对该被调函数进行 说明(声明)。说明的目的是使编译系统知道被调函数 返回值的类型及其所需实参的情况,以便在主调函数中 检查实参是否正确、并指定类型对返回值作相应的处理 。 其一般形式为: 类型说明符 被调函数名(类型 形参,类型 形参 ); 或为: 类型说明符 被调函数名(类型,类型); 括号内给出了形参的类型和形参名,或只给出形参类 型。这便于编译系统进行检错,以防止可能出现的错误。 注意“声明”和“定义”的不同! 这就是函数原型 ,可在编译阶段 对调用函数的合 法性进行检查 这就是函数原型 ,可在编译阶段 对调用函数的合 法性进行检查 “声明”是动词;“函数原型”是名词。 我们是用“函数原型”去对函数进行“声明”。 对函数声明的几点说明 n如果被调函数的返回值是整型或字符型时,可以不 对被调函数作说明,而直接调用。这时系统将自动对被 调函数返回值按整型处理。但此种情形将不检查参数类 型和个数。(不建议使用) n当被调函数的函数定义出现在主调函数之前时,在 主调函数中也可以不对被调函数再作说明而直接调用。 因为系统在编译时已经知道函数的相关信息。 int max(int a,int b) if(ab)return a; else return b; main() int max(int a,int b); int x,y,z; printf(“input two numbers:n“); scanf(“%d%d“, z=max(x,y); printf(“maxmum=%d“,z); 右例中,函数max的定义放在 main 函数之前,因此可在main 函数中省去对max函数的函数说 明int max(int a,int b)。 n如在所有函数定义之前,在函数外预先说明了各个函 数的类型,则在以后的各主调函数中,可不再对被调函 数作说明。 对函数声明的几点说明 char str(int a); float f(float b); main() char str(int a) float f(float b) 其中第一,二行对str函数和f函 数预先作了说明。因此在以后 各函数中无须对str和f函数再作 说明就可直接调用。 4.对库函数的调用不需要再作说明,但必 须把该函数的头文件用include命令包含 在源文件前部。 8.5函数的嵌套调用(例) 本题可编写三个函数,两个分别是用来求三个数中 最大、最小值的函数max和min,另一个是用来计算差 值的函数dif。主函数调dif计算差值,在dif中先以三个 数为实参,分别调用max和min求最值,然后返回dif, 再返回主函数,得出结果。 例 求三个数中最大数和最小数的差值 main( ) 调用函数dif 输出 结束 dif函数max函数 调用函数max 调用函数min min函数 8.6函数的递归调用 n一个函数在它的函数体内调用它自身称为递归调用 。这种函数称为递归函数。语言允许函数的递归调用 。在递归调用中,主调函数又是被调函数。执行递归函 数将反复调用其自身,每调用一次就进入新的一层。 例如有函数f如下: int f(int x) int z; z=x*f(x-1); return z; n这个函数是一个递归函数。但是运行该函数将无休 止地调用其自身,这当然是不正确的。为了防止递归调 用无终止地进行,必须在函数内有终止递归调用的手段 。常用的办法是加条件判断,满足某种条件后就不再作 递归调用,然后逐层返回。 2.数组名作为函数参数(地址传 递) n用数组名作函数参数时,则要求形参和相对应的实 参都必须是类型相同的数组,都必须有明确的数组说明 。当形参和实参二者不一致时,即会发生错误。 n在用数组名作函数参数时,不是进行值的传送,实 际上形参数组并不存在,编译系统也不为形参数组分配 内存。那么,数据的传送是如何实现的呢?在我们曾介 绍过,数组名就是数组的首地址。因此在数组名作函数 参数时所进行的传送只是地址的传送,也就是说把实参 数组的首地址赋予形参数组名。形参数组名取得该首地 址之后,也就等于有了实在的数组。实际上是形参数组 和实参数组为同一数组,共同拥有一段内存空间。在定 义函数时可以不考虑形参数组的长度。 n前面已经讨论过,在变量作函数参数时,所进行的 值传送是单向的。即只能从实参传向形参,不能从形参 传回实参。形参的值发生改变后,实参并不变化。而当 用数组名作函数参数时,情况则不同。由于实际上形参 和实参为同一数组,因此当形参数组发生变化时,实参 数组也随之变化。当然这种情况不能理解为发生了“双 向”的值传递。但从实际情况来看,调用函数之后实参 数组的值将由于形参数组值的变化而变化。 2.数组名作为函数参数(地址传 递) 2.数组名作为函数参数(例) 例 数组 元素与 数组 名作函数参 数比较。 1 2 a 调用前 1 2 a x 调用 2 1 a x 交换 2 1 a 返回 #include void swap2(int x) int z; z=x0; x0=x1; x1=z; main() int a2=1,2; swap2(a); printf(“a0=%dna1=%dn“,a0,a1); 地址传递 n用数组名作为函数参数时还应注意以下几点 : n形参数组和实参数组的类型必须一致,否则将引起 错误。 n形参数组和实参数组的长度可以不相同,因为在调 用时,只传送首地址而不检查形参数组的长度。甚至 在函数形参表中,允许不给出形参数组的长度,而用 一个变量来传递实参数组元素的个数。 n多维数组也可以作为函数的参数。在函数定义时对 形参数组可以指定每一维的长度,也可省去第一维的 长度。 2.数组名作为函数参数(地址传 递) 8.8局部变量和全局变量 8.8.2 全局变 量 n全局变量也称为外部变量,它是在函数外部定义的变量。 n它不属于哪一个函数,它属于一个源程序文件(*.c)。 n其作用域是定义变量的位置开始到整个源程序的结尾或者有extern说明的 其它函数和源文件。 n外部变量定义与外部变量说明不同。 n若外部变量与局部变量同名,则外部变量被屏蔽 定义 说明 u次数: 只能1次 可说明多次 u位置: 所有函数之外 函数内或函数外 u分配内存: 分配内存,可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论