《C语言程序设计》教案(清华谭浩强)_第1页
《C语言程序设计》教案(清华谭浩强)_第2页
《C语言程序设计》教案(清华谭浩强)_第3页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

(完整版)《C语言程序设计》教案(清华谭浩强)(完整版)《C语言程序设计》教案(清华谭浩强)PAGEPAGE32第一章 C语言及程序设计概述本章要求:CCCPC了解C语言程序设计思想的基本篇;重点:①C语言的主要特点;②C语言在PC机上的运行过程及上机操作过程;③常用算法的应用难点:无一、C语言概述C是目前国际上在各种计算机运行较为广泛流行的一种高级语言.主要表现为:C语言:适合于作为系统描述语言—-可用来写系统软件。具有高级语言的特点,又有低级语言(汇编语言)的特点。CAT&TDennisRitchie1972CB.(ALGOL60)C语言:最早开始是用于UNIX操作系统。(C语言和UNIX是相辅相成的)DBASE、MicrosoftExel、MicrosoftWord、PC—DOSC编子程序编写的。1983(美国国家标准化协会)ANSIC1987年:—-TurboC1.0(Borland) 1988年:TC1.5(图形和文本窗口)1989年:——TurboC2。0 (DOS操作系统、查错、Tiny模式生成com文件1991年:—-TurboC++(3.0)支持windows3.X说明:TurboC和寄存器。二.C语言的特点1.语言简洁、紧凑、使用方便、灵活C语言:——共有32个关键字,9种控制语句;程序书写自由,主要用小写字母表示;运算符丰富C34即:把括号、赋值、强制类型转换都作为运算符处理有丰富的数据类型整型、实型、字符型、数据类型、指针类型、结构体类型、共用体(联合)复杂的数据结构(链表、树、栈、图)的运算。4.具有结构化的功能,用函数作为程序模块,实现程序的模块化语法限制不太严格,程序设计自由度大.(放宽了语法检查)例:1)对数组下标越界不作检查,由程序编写者自己保证程序的正确;2)整型数据、字符型数据、逻辑型数据可以通用。能直接访问物理地址,能进行位(bit)件进行操作。7C说明:C语言比其它高级语言难掌握,对编程人员要求较高程序员使用C语言编写程序会感到限制少、灵活性大,功能强,可以编写出任何类型的程序.三.C例:main() /*主函数*/{inta,b,sum; /*定义变量a=123;b=456;sum=a+b;printf(“sumis%d\n",sum); /*输出变量*/}说明:程序一般用小写字母书写;2)每个程序必须要有一个main()(只能一个注:CC函数:系统提供的库函数;用户设计的函数。3)程序体必须在{}之间;4)5)用/*………。.*/作注释四、C程序的上机过程1.演示书:P5程序上机步骤 书:P7注:C语言是一种编译语言,编译语言的特点:编编连源程序目标程序*.OBJ序C编译程序 Link程3.DOS下C语言的运行DOSCTurboC2.0TurboC2.0的特点:是一个把①编辑②编译③连接④运行等全部操作集中在一个界面上(2)TurboC2.0的操作及运行 书:P8五、算法的概念1.算法的概念 书算法:程序的操作步骤。程序中的数据在程序设计中: 操作步骤有:程序=数据结构+算法 沃思NikiklausWirth程序=算法+数据结构+程序设计方法+语言工具和环境程序=算法+数据结构+程序设计方法+语言工具和环境2.计算机算法分为两大类:①数值运算算法②非数值运算算法(1)注:数值运算一般有现成的模型,算法较成熟。(2)3、常用简单算法(1)累乘 即:1×2×3×4×5……×1001×2→S(结果)S×3S(结果S×4S(结果┇S×100→S(结果)(2)累加 即:1+2+3+4+5……+1001+2→S(结果)S+3S(结果S+4S(结果┇S+100→S(结果)(3)找最大值5,2,4,12,95→max(max放最大值,后面的数都和它比较2〉max 不成立4max 不成立12〉max 成立:12→9〉max 不成立注:该算法可扩展为在一批数据中,找某一个数(4)其它算法P152。22。3例2。42。5课余自学(必须)4、算法的表示常用的有:①自然语言②传统流程图③结构化流程图④伪代码⑤PAD传统流程图起止框 输入输出框 判断框 处理框 流程线 连接点表示方法:P19例注:为了限制流程线的滥用,提出三种基本结构:①顺序结构 ②选择结构 ③循环结构f表达式tf表达式t语句语句语句语句语句表达式语句1 语句2表达式语句“表达式语句“”结构语句表达式b)“"结构N—S特点:去掉了带箭头的流程线,全部算法写在一个矩形框内.称N-S结构化流程图ABP成立ABP成立不成立ABP1A直到P1成立顺序结构 选择结构 循环结构作业:p372。4TurboC2。0第三章数据类型、运算符与表达式本章要求:CC要求熟练掌握数据类型、运算符与表达式。重点:①C语言数据类型定义的方法和分类。②C语言运算符、表达式的使用以及它们的主要特点。难点:自增、自减运算符、赋值运算符、逗号运算符及它们的混合使用一.数据类型C(C1.数据类型分类:整型int基本类型 字符型 单精度型实型(浮点型)枚举类型 双精度型double数据类型 数组类型构造类型 结构体类型struct共用体(联合)类型union指针类型*空类型 void说明:在程序中对用到的所有数据都必须指定其数据类型.2.C语言中的常量和变量常量变量:——在程序运行过程中,其值可以改变的量。说明:1)常量和变量,都要有一个名字表示它;符号常量的定义为:#defineP302345。5‘e’2)C单元.

Ca 变量名3存储地址)20003地址的概念3.(1)整型

变量值存储单元1)整型常量:十进制整数 123,—11,0非0开头八进制整型 0123,—0110开头十六进制整型0x110x200x0D0XFF0x4e0x/0X说明:在一个整常量后面加一个字母:lL,是长整型常量。22L0733L2)整型变量:定义 存储字节 数的范围基本型 intx (2字节) -32768~32767短整型 shortintx (2字节) —32768~32767长整型 longintx (4字节)-2,147,483,648~2,147,483,647无符号型unsignedintx(2字节) 0~65535unsignedshortx(2字节) 0~65535unsignedlongx(4字节) 0~4,294,967,295注:数据在内存中是以:二进制形式存放如:9 为 00001001P443。5P443。5注:数据超过数据范围,会发生数据溢出 例3。2、(2)实型(浮点数)实型常量:十进制整数 1.23 。0123指数形式 1。23e3,1。00e—3实型变量: 数的表示范围P46表3.2单精度 float x (4字节)3.4x10-38~3。0TC默认双精度 doublex (8字节0~0说明:实型常量不分float和double,只有十进制表达方式有的C编译系统64位存储方式,如尾加f或F可表示32位:324。例:x=1。23; x=123e3 P47例3。4(存储精度)(3)字符型字符常量:P483。33.5用单引号括起来的一个字符 Ab)P483。33.5\0字符串结束符 \n换行 \t水平制表\ddd八进制数 \xdd十六进制2)字符变量:charc (1说明一个字符变量只能放一个字符常量实际是把该常量的ASCII值送入字符变量中即‘B'(66) c(字符变量)P374ASCIIp503.6-7c=‘B’c66P50P50unsignedchar0—255 char-128-127有符号数在TC中是用补码表示127(0x7f)01111111 128(0x80)10000000复习:补码的规定:正数:其原码、反码、补码相同负数:最高位为1,其余各位为原码的反码(原码的相应位取反),然后对整个数加1。140(0x8c)10001100→111100111(1)→11110100→—0x74-0x74 1000101111)→10001100→0x8c(0x80743)字符串常量用双引号括起来的字符 “a”,“ABFD”“a"=“a\0”<〉‘A’说明:C规定,在每一个字符串的结尾应加一个“字符串结束标志()以便系统判断字符串是否结束.各类数值间的混合运算整型、字符型、单精度型、双精度型数据—-可以混合运算字符型、整型——可以通用规则: 高double longunsigned低 int char,short例如10+’a'+1。5—8765。1234*’b’ -858873.593200(TC默认6位小数10+97+1。5-8765.1234*98二.运算符和表达式CC能把一些基本运算模块用单一的运算符处理使用丰富的运算符,构成多种表达式CC从左到右的结合运算顺序;即:a=5+x-10;运算对象与左边运算符结合P55从右到左的结合运算顺序;即:x=y=7CP55基本运算符(算术运算符C7单目运算符:(表示符号)正号“+” 负号“—”*、/、%(模运算,求余运算,两侧为整数说明:运算顺序的结合方向从左到右求余(取模)同。即:-5%3值为-2、-5%—3值为—2、5%—3值为22.自增、自减运算符(优先级高于算术,右结合)作用:——使变量的值增1或减1++i(——i)——ii11),i++(i——)—-先使用i的值,然后再使i加1(减1。例:i=4;j=++i; i值为5,值为5; j=i++; i值为5,j值为4说明:1)自增、自减运算符++(-—),只能用于变量,不能用于常量或表达即:5++、(a+b)++ ——不合法2)运算顺序的结合方向从右到左例 例:main(){inti=3z,x,y; z=(i++)+(i++)+(i++)x=y=3;//结果:z值为9 i值为z=x+++y;//变量x右结合运算符++ (不是3+4+5=12)printf("z=%d,x=%d,y=%d",z,x,y);}输出结果:z=6x=4y=3如果:z=-x+++y ; 输出结果:z=0x=4y=3 x先为-4,然后+y,最后x++赋值运算符和赋值表达式(优先级低于算术,右结合)作用:将一个数据赋给一个变量即:x=21注意:如果赋值运算符两侧的类型不一致,在赋值时,要进行类型转换 。P61例3。即:floatf; f=23 f值为23.0000 符号位扩展(2)复合的赋值运算符“+=、-=、*=、/=、%=”—-在赋值符“=”之前加上其它运算符称复合运算符(也称为自反运算符)例:a+=3等价于a=a+3x*=y+8等价于x=x*(y+8)y/=4等价于y=y/4m%=3等价于m=m%3说明:C语言采用这种复合运算符:为了简化程序,使程序精练;提高编译效率。(3)赋值表达式格式:变量=表达式表达式:可以是 1)常量、变量、算术表达式2)赋值表达式即:a=(b=5) 或a=b=5 (运算顺序的结合方向从右到左)例:a=b=c=6 a=5+(c=6) (a=11c=6);求:;[a*a;92)a=-63)a+=-6]-6+-6a为:-12 结果值为4.逗号运算符和逗号表达式(优先级最低,左结合)格式:表达式1,表达式2 即:例: 3+5,6*9; 值为541,22a=2*5,a*3;a10结果值为:30(先求:a=2*5x=(a=2*5,a*3),a+4a10x30结果值为:14说明:12强制类型转换运算符(优先级高于算术,右结合)在要转换的数据前即:(int)x;(int(a+b)(int)x+y(类型名)表达式CP563。8x%3(float6.关系运算符和关系表达式(书P87(优先级低于算术,左结合,高于赋值)6< 〈= > >=(优先级高) == !=(优先级低(2)关系表达式表达式关系运算符表达式即:a>b a+b>=b+c (a=4)〈(b=8) ‘x’==说明:关系表达式值:是一个逻辑值,即“真”或“假”C语言:1-—代表“真” 0——代表“假逻辑运算符和逻辑表达式(书P88(优先级低于关系,左结合)(1)3种逻辑运算符p89表5.1&&(与) ||(或) !(非)逻辑表达式表达式逻辑运算符表达式 p89即:(a〉b)||(a+b>=b+c) (a=4)&&(b=8) 1||∞‘x’&&‘y'值为1 1说明:逻辑表达式值:优先次序(由高到低:(非) 算术运算符 关系运算符 &&和|| 赋值运算求值短路:5>3&&2||8〈4-!0 1||∞(结果1)0&&∞(结果0)如:a&&b&&c a<〉0才判断a&&b条件运算符(P97)格式:表达式1?表达式2:表达式3执行:先求解表达式1,为真(非零,求表达式2为假(0),y=(a>b)?a:b;说明:a)条件运算符要求有三个操作对象(称三目元运算符b)条件运算符优先于赋值运算符y=(a〉b)?a:b; 先求(a>b)?a:b后赋c)条件运算符的结合方向为“自右至左”(a〉b)?a:b 可写为:a〉b?a:ba〉b?a:b+5 相当于:a>b?a:(b+5)a〉b?a:c>d?c:d 相当于:a>b?a:(c〉d?c:d)*9.位运算符(书P298(一般掌握)位运算:-—是对字节或字中的实际位进行检测、设置、屏蔽、移位.位运算符:&——位逻辑与 |——位逻辑或 ^—-位逻辑异或~—-位逻辑反 〉——右移 〈——左移三、运算符小结1.2.右结合方向的运算符主要有:自增、自减运算符、赋值运算符(复合的赋值运算符、条件运算例:1)i=3; printf("%d,%d”,i,i++); 输出:4,32)a=1;b=1;c=2;a=bc*5;输出:a11b11c10a>b?a〉c?a:c:b>c?b:c 相当于:a>b?(a>c?a:c):(b〉c?b:c)(求最大值,如a=2,b=8,c=5 结果为:8)3.运算符的优先次序(书P375附录Ⅲ)()//—转移、算术、关系(<<=〉>=)、关系(==!=、&&、||、条件(?)、赋值、逗号例:1)—a++ 相当于—(a++)2)x=4,y=7求:y+=++x-3 x的值5 y的值93)x=4,y=7求:y=y+++x-3 x的值4 y的值94)a=7,x=2。5,y=4。7求:s=x+a%3*(int(x+y)%*2/4 s的值2。a%3*(int)(x+y)%*2=》1(整型)/4(整型)=》0.25=》0(整型)5)a%3&&a%5||a++〉++b如:a=7,b=5a8b611||1如:a=15,b=15a16b16结果值01||0如:a=15,b=14a16b15结果值00||0如:a=15b=13a16b14结果值10||1数:P39例3。1P44例3。2P443。3字符:P49例3。5P50例3.6P51例3.7五、该章的主要习题P65 3.5 3.6 3。8 3.9 3.10 3。12六、该章的主要上机内容P39例3。1P443。2P44例3。3P513。7P65 3.63。83。10第四章简单的C程序设计(顺序程序设计)知识点:1、赋值语句; 2、字符数据的输入/输出;3/printfscanf其它格式控制符只作了解)4、程序的结构框架。重点:赋值语句;基本输入/printfscanf%c、%f、%d难点:无一、C程序结构CC12源程序文件预编译命令1n说明部分执行部分(语句)P671、控制语句①条件:if else②循环:for()③循环:while()④循环:do while()⑤循环结束:continueⒶ终止循环或switch:break⑦多分支:switch⑧转向:goto⑨函数返回:return2、函数调用语句printf(“a=%d",a);3、表达式语句i=i+1表达式 i=I+1;表达式语句 函数调用也可以认为是表达式语4、空语句:一个“;”5、复合语句(用{:分程序){x=3;x=x+1;print(“x=%x”,x)}二.赋值语句变量名=表达式注:是组成顺序结构的主要语句。a=b; if(maxx)max=x;三.基本输入/输出语句C语言本身不提供输入输出语句,输入输出操作是由函数来实现即:printf putchar scanf getchar(1)这些函数构成一个标准的I/O函数库(放在“stdio。”中)(2Cinclude户源文件中。#include〈stdio。h> #include“stdio。当前目录 当前定义的目录中寻找printfP77P774.1输出表列:——需要输出的数据、表达式即:printf(“x=%5.1f,y=%d,z=%c”,x,y,zd,i 带符号十进制形式u 无符号十进制形式例c 字符形式s 字符串形式f 实数(小数)形式 默认6位小数说明:1)printf(“y=%-4d”,y) 输出数据左对齐(默认为右对齐2)数据输出长度的修正;l:printf(“%ld,%lfiyh——输出短型数据即:printf(“%hua—m。n m最小宽度n小数(实数) —左对2.putchar函数——字符输出函数向终端输出一个字符格式:putchar(变量) putchar(x)putchar“\n")输出一个换行3.scanf函数-—格式输入函数格式:scanf(格式控制,地址表列)P80P804.3地址表列:——由若干个地址组成的表列,有:变量地址&x字符串的首地址&——地址运算符功能:求变量的地址(只能用于变量)&x——表示x变量值的内存单元的地址即:scanf(“%d,%4d”,&a,&b)说明:1)不带分隔字符的方式,系统将自动按格式说明截取数据例:scanf(“%4d%*3d%f",&I,&p);输入:12345678.93时得I=1234,p=8.932)带分隔字符的方式(分隔字符:空格、tab、回车、逗号即:scanf(“%d,%d”,&a,&b)4.getchar函数——字符输入函数从终端输入一个字符格式:getchar() 即:c=getchar()函数值是从输入设备得到的字符四、该章的主要例题已知矩形的两边长,求矩形的面积、周长大小写字母互相转化P83五、该章的主要习题 P844。5~4.9第五章选择结构程序设计知识点:1、关系、逻辑运算符、逻辑真/假;2、关系表达式、逻辑表达式;3、分支的概念及其算法描述;4、三种IF分支语句;5、条件运算符;6、SWITCH语句。(了解)重点:1、关系、逻辑运算符、逻辑真/假;2、关系表达式、逻辑表达式;3IF难点:1、逻辑真/假;2、关系、逻辑运算优先级.在程序设计中,表示一些复杂的条件1、关系运算符及关系表达式(第三章)2、逻辑运算符及逻辑表达式(第三章)3、条件运算符(第三章)二.分支语句(书P91)从一个条件表达式中,选择语句的执行(用if语句或switch语句来实现)t。表达式t。表达式f表达式t语句语句1语语句1语1.If语句(1)Cif1)if(表达式)语句2)if例:if(x>y)(表达式)语句1printf(“%d”else语句2,x);注意“;”位置例:if(x>y)printf(“%d”,x);elseprintf(“%d”,y);注意分号“;”if(1)语句1elseelseifif(2)(表达式3)语句2语句3……elseif(表达式n)语句nelse语句n+1例:p925。6(2)if()和else后的执行语句可以使用复合语句{}例5.1、5.2p93 if结构 将输入的三个数从大到小排列输例5.3p95 if嵌套结构 计算函数值if例:if(a>b)y=a; 条件运算符else 可以用:y=(a〉b)?a:b;y=b;例5.4p98 条件运算符代替if结构将输入字符中的大写转换成小写输2.switch语句(了解)switch语句——是多分支选择语句表达式表达式(表达式)语句2 语句3 语句4(表达式)语句格式:switch表达式=常量表达式n执行语句n{case常量表达式1:语句1;break;case2break;case3break;┇casenn;break;default 例:四级(ABCD)转化成百分制#include<stdio。h〉main(){chargrade;scanf(”%c”,&grade);switch(grade){case’A’:printf(”85~100\n");break;case'B':printf(”75~84\n");break;case’C':printf(”60~74\n”);break;case'D’:printf(”<60\n”);break;default:printf(”error\n”);}}例:百分制成绩转化成五级(ABCDE)五级记分5—4-1三、程序举例例5.7p103 运费计算(自学)p101例5。6求一元二次方程根(自学)p100例5。5判断某一年是否是闰年(自学五、该章的主要习题 P1045。3~5.10该章的主要上机内容P91例5。2、P100例5。5,P101例5.6P104习题5。5、5.6、5。9 其他:上机实验指导书中内容第六章循环结构程序设计知识点:1、循环的概念及其算法描述;2、goto循环;3、while循环;重点 4、do—while循环;重点6、for循环;重点难点 7、break、continue语句8、各种循环结构中的执行循环体、判断循环条件的顺序;重点9、各种循环结构在一定条件下的转化。重点难点一、循环结构的概念循环语句主要用于:重复执行的操作语言在实现循环过程-—可使用以下语句:a)用goto语句和if语句构成循环 b)用while语句用do—while语句 d)用for语2.循环可分为二种类型结构:a)“当"结构 b)“直到”结构语句语句语句语句二.循环语句gotoifgoto格式:goto语句标号语句标号:用标识符表示例:gotonext; 如: goto123;(不合法)gotoif一般较少使用(不符合结构化原则)例:求

2n main()50i50{inti,sum=0;i=1;loop:if(i〈=50){sum=sum+2*i;i++;gotoloop;}printf(“%d\n",sum);}while语句 -—实现“当"循环结格式:while(表达式)语句50例:求i

2n main(){inti,sum=0;i=1;while(i<=50)说明: {sum=sum+2*i;i++;}printf(“%d\n”,sum)语句可为复合语句(用{}构成) }do—while语句 —-实现“直到型”循环结格式:do 语句while(表达式;50例:求i

2n main(){inti,sum=0;i=1;do{sum=sum+2*i;i++;}while(i<=50);printf(“%d\n”,sum);}dowhile和while比较p109例6.44.for语句可以用于循环次数已知和循环次数不确定(可以代替while语句)(应用广泛,而且使用较活)格式:for(表达式1表达式23)语句过程:11F2T语句3表达式1-——-—循环变量赋初值表达式2——-—-循环结束条件表达式3—————循环变量增值即:for(循环变量赋初值,循环结束条件,循环变量增值)语句例:求

2n for(i=1;i〈=50i++)sum=sum+2*i;50i50for(1)用while来表示 表达式1forwhile(表达式2){语句表达式3;}(2)表达式可以省略,但分号不能省略a)省略表达式1i=1for(;i〈=50;i++) sum=sum+2*i2——产生死循环for(i=1;;i++) sum=sum+2*i3for(i=1;i〈=50;){sum=sum+2*i;i++;}13i=1 i=1for(;i<=50;) while(i〈=50){sum=sum+2*i; 相当于 {sum=sum+2*i;i++;} i++;}(3)表达式1,表达式3可以是: a)简单的表达式b)逗号表达表达式2: 一般是关系表达式或逻辑表达式即: for(sum=0,i=1;i〈=50;i++,i++)sum=sum+2*i;或: for(sum=0,i=1;i<=50;i=i+2)sum=sum+2*i(4)breakcontinue语句break:可以用来从循环体内跳出循环体(提前结束循环)continue:用于跳过循环体中下面尚未执行的语句,接着重新执行循环的判断.p115例6。5将100-200间不能被3整除的数输出三、程序举例用多种循环方法实现1由泰勒展式计算sin(x)的近似值2。p115例6。6求π的近似值1-1/3+1/5-1/7+3。p115例6。7求Fibonacci(斐波纳契)数列40个F=1 (n=1)1F=1 (n=2)2Fn

+Fn—1

n-2

(n〉=3)4。p115例6。8判断m是否是素数5.p115例6.9求100—200间的所有素数106-maxP1206.1~6.15五、该章的主要上机内容P115例6.56。66.7、例6.9P1206。4、6.7、6。9、6。11、6。其他:上机实验指导书中内容作业解答:5-8利润提成:类似所得税第七章数组1、数组的概念及数组的定义;2、在程序设计中的如何使用数组;3、字符数组是C语言存放字符串的主要方法,并注意字符串结束标志的规定。重点:①数组的组成和特点.②一维数组和二维的定义、赋值。难点:①数组元素存储格式对程序设计的使用.②字符串在数组中的组成以及字符串操作语句的使用。基本类型数组类型C语言:数据类型 构造类型 结构体类型共用体类型指针类型一.数组的概念数组:—-1)是一组有序数据的集合2)这个集合用一个数组名来表示3)数组的元素序号用一个下标值来表示如:a[0],a[1],a[2],a[3] b[1][1],b[1][2],b[2][1],[2]注意:a)0b)——可以是常量表达式常量表达式:包括常量和符号常量(用#define定义的),但不能包含变量。C即:intn;scarf(“%d”,&n);intx[n]; /*定义数组*/c)数组分为:一维、二维等,主要由下标值的多少来确定.二.一维数组1.定义格式:类型说明符 数组名[常量表达式类型说明符:——表示数组的类型int,short,long,unsigned,float,double,char数组名:——表示各数组元素的统一名字,定义方法和变量名相同常量表达式:——表示数组的长度即:inta[10]注意:C语言不提供数组下标越界的保护,设计时要注意。数组元素的初始化数组在定义的时候,同时,可对数组元素进行初始化格式:staticinta[10]={0,0,0,0,0,0,0,0,0,0} 静态定a[10]={0,1,2,3,4,5,6,7,8,9}说明:1)static数组不赋初值,系统会对所有数组元素自动赋以0值。即:inta[10]={0,0,0,0,0,0,0,0,0,0}; 等价于: staticinta[10]2)对全部数组元素赋初值,可以不指定数组长度。即:staticinta[]={0,1,2,3,4,5};等价于:staticinta[6]={0,1,2,3,4,5};3)可以部分赋初值即:inta[5]={1,3};3.数组元素的引用C4.程序举例P1247。2例7P124三.二维数组和多维数组1.定义格式:类型说明符 数组名[常量表达式][常量表达式类型说明符:——表示数组的类型int,short,long,unsigned,float,double,char数组名:——表示各数组元素的统一名字常量表达式:——表示数组的长度即:inta[5][6]说明:05×6=30b)C即:先存放第一行的元素,再存放第二行的元素34345存储单元a=678对应表:129→3a[0][4]a0]0][]a[1]0]a1]1][]a[2]0]a[2]1]a[2]可以计算数组元素在数组中的序号 [2]假设m×na,计算a[i][j]序号的公式:i×n+j如:a[0][1] 0×3+1=1(第二个) 如a[1[2]的序号是:1×3+2=5a[2][2] 2×3+2=8d)多维数组的定义格式:类型说明符 数组名[常量表达式][常量表达式][常量表达式即:类型说明符 数组名[长度1][长度2][长度3]…inta[2]2.二维数组初始化1)两种基本方法:(a)分行给二维数组赋初值staticinta[2[3]={{1,2,3},{5,,7}(b)所有数据写在一个化括弧内staticinta[2][3]={1,2,3,5,6,7}2)可以对部分元素赋初值staticinta[2[3]={{1},{3}}即: 100300staticinta[3][4]={{1},{3,1},{0,0,9}即: 100031000090定义数组时,第一维的长度可以不指定,但第二维的长度要指定(编译系统自动计算).等价于:staticstaticintinta[][3]={1,2,3,4,5,6,7,8,9}a[3][3]={1,2,3,4,5,6,7,8,9}等价于:staticstaticintinta[[4]={{1},{3,1},{0,0,9}}a[3][4]={{1},{3,1},{0,0,9}}4.程序举例P1287。4P128例7.53×4矩阵求最大元素及行列号四.字符数组存放字符数据的数组;每一个元素存放一个字符.1.定义char数组名[即:charc[10;intc[10]2.字符数组的初始化1)staticcharc[5]={‘a',‘b’,‘c’,‘d’,‘e';注意:staticcharc[5]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’; (错误,多一个元素)staticcharc[5]={‘a’,‘b’,‘c’;(正确)后面元素自动定为空格2)staticcharc[]={‘a’,‘b',‘c’,‘d’,‘e’};系统自动根据初值个数确定数组长度3.字符数组的引用一个字符数组元素,代表一个字符.即:x=c[2] x的值为4.字符串的使用C语言中,将字符串作为字符串来处理。\0',在遇到字符‘\01)使用字符串常量进行数组初始化staticcharc[]={“Iam或staticcharc[]=“Iamhappy”;等价于 staticcharc[]={‘I',‘‘,‘a',‘m’,‘h’,‘a’,‘p’,‘y’,’\0’};注:(a)系统对字符串常量自动加一个‘\0’(b)字符数组并不要求它的最后一个字符为‘\0’2)数组长度始终保证大于字符串实际长度staticcharc[10]={“ABCDE”};(第5\0,6ASCⅡ0)staticcharc[10]={‘A’,‘B’,‘C’,‘D’,‘E'(5字符ASCⅡ为0)7—6P131例子打印图形(J5_1.C)#defineNLprintf("\n")main(){chara[10]={'*'*’,’*','*',’*',;inti,j; 图案层数for(i=0;i〈=4;i++){NL; 图案前空格for(j=1;j<=i;j++)printf(";for(j=1;j<=10-(2*i-1);j++)printf(”%c,a[j];} *个数}*************************5.两种方法:逐个字符输入输出。用格式符“%c”进行scanf“%c”,c[i]);整个字符串一次输入输出。用格式符“%s”进行例:staticcharc[]={“abcde”};printf(“%s”,c) (%s”c[0])2)scanf函数输入一个字符串staticcharc[6];scanf(“%s”,c;5c不用加地址符&,即&c;因数组名代表数组的起始地址6.字符串处理函数在C的函数库中提供了一些用来处理字符串的函数scanfprintf使用scanfprintf数组名(即使用字符数组名的首地址)例:main() (j5_9。c){chars1[3],s2[5];scanf(“%s%s”,s1,s2);printf(%s\n%s\n”,s1,s2);}输入:ABCDEFHK (s1=“ABC”s2=“DEFHK"输出:ABCDEF说明:C语言规定,scanf函数遇空格或回车就结束本次输入。puts格式:puts(字符数组)即:puts(str)将一个字符串str(以‘\0’结束的字符序列)输出到终端gets函数格式:gets(字符数组)即:gets(str)输入:abcde读取字符串并把它们依次放到str指向的字符数组中去.得到一个函数值,该函数值是字符数组的起始地址。strEOF换行符或EOF不进入字符串,被转换为“\0strcatstrcat(str1str2 str1,str2str2str1str1例:staticcharstr1[20]={“ABCDEF”}staticcharstr2[]={“gggg”}P136strcat(str1,str2)的结果为:ABCDP136strcpystrcpy(str1str2); str2str1例:strcpy(str1,“abcd”);strcpy(&a[n],&a[n+1]);作用:将n个字符以后的字符顺序地向前移动一个序号。说明:a)str1>=str2b)str1数组名,str2c即:str1={“abcde"}; str1=str2;(不合法)可用strcpy(str1,str2)注:strcpy(str1,str2;是将str2中前面2个字符拷贝到str1‘\0strcmpstrcmp(str1,str2);str1str2ASCII如果:str1=str20如果:str1>str2,则函数返回正整数如果:str1<str2,则函数返回负整数strlenstrlen(str) 测试字符串长度,不包括‘\0’strlwrstrlwrstr) 将字符串中大写字母换成小写字母struprstrupr(str) 将字符串中小写字母换成大写字7.程序举例:书P138例7.8 例7.9五、该章的主要例题:717.27。3747。5767.87.9六、主要习题:7.1、*7.2、7.3、7.5、7.6、*7。9、7。11、*7。137.27.374757.778717.39、7。11其他:上机实验指导书中内容第八章函数与程序结构1、函数的一般概念:函数形参、实参、返回值,函数的类型;2、动态存储变量与静态存储变量 3、变量的生存期与作用域重点:①函数的定义和调用及使用函数的特点。②函数间的参数传递(值传递和地址传递).③变量存储作用域、编译预处理的使用。难点:①函数参数传递(数值、地址)及形参、实参的使用;②变量存储作用域及自动变量与静态变量的区别.一、函数概述一个较大的程序:可由若干程序模块组成,每一模块用来实现一个特定的功能。—-用子程序可实现该模块功能。-—在C语言中:子程序称为:子函数可由一个主函数和若干个函数构成。分为可由一个主函数和若干个函数构成。分为标准库函数用户自定义函数语句调用语功语句功能语函数的作用: 减少重复编写程序段的工作语句调用语功语句功能语标准库函: 由C语言预先编写的一系列常用函数(系统提供)TurboC的标准库——包含400多个常用函数用户自定义函数:一般自定义函数和自定义函数库(用户先已编好的)二、函数定义(子函数的设计)1.函数定义格式:类型定义符函数名(形式参数表列){函数体}说明:1)类型定义符:函数返回值的数据类型a)int,char,float,double默认intb)函数无数据void2)函数名:函数的名称(用户取的:合法的标识符)3)形式参数表列:函数调用时传递信息的通道有两种表示方法:a)(参数说明形式参数) 传统风格b)(形式参数)参数说明例:floatadd(floatx,floaty) floatadd(x,y){x=x+y; {floatx,yreturn(x); x=x+y;} return(x);}a). b)函数的返回值returnreturnvoid”定义“无类型"例: main() /*(打印平方表)*/voidprin(intx);{voidprin(intx);inti;for(i=1;i〈=10;i++)prin(i);}voidintprin(x;x){printf(“%d\t%d\n",x,x*x);}三、函数间的参数传递际参数”.实参可以是常量、变量、表达式 实参应和形参类型相同或相容P146例8。2(主函数) c=max(a,b); (子函数)max(intx,inty)实际参数

参数传递形式参数(1)数值传递方式特点:实参通过复制的方式传递给形参(占用不同的内存空间实参地址 2 形参地址a x调用函数的实参:给出具体数据(2)地址传递方式特点:参数传递不是数据本身,而是数据的地址(使用同一地址空间实参地址 形参地址调用函数实参:一般是数组名或指针变量四、函数调用及值的返回函数调用格式:函数名(实参表列调用的过程:a)通过函数名,找到定义的函数将实际参数传递给被调函数的形式参数(C例:P1508。main(){inti=2,p;p=f(i,i) /*f为f(3,3)printf(“%d",p);}intf(inta,b){intc;if(a〉b)c=1;elseif(a==b)elsec=—1;return(c);} 运行结果:0说明:(1)应避免这种情况的产生,可写为:①自左而右顺序 ②自右而左顺j=i; j=++i;k=++i; p=f(j,j);p=f(j,k);(2)在printf(“%d,%d”,i,i++);中同样存当:i=3;结果为: 4,3函数调用的几种方式函数语句 把函数调用作为一个语句,即单独一个语句行.即:printstar();函数表达式 函数出现在一个表达式中,要求函数带回一个确定的值以参加表达式的运算。即:c=2*max(a,b);函数调用作为一个函数的实参;即:m=max(a,max(b,c));函数调用作为一个函数的实参;即:m=max(a,max(b,c));函数说明作用:在函数使用前对函数的特征进行说明的语句.(用户自定义函数)对已定义的函数的返回值进行类型说明。告诉系统在本函数中将要用到的函数是什么类型。C语言规定:以下几种情况可以不使用函数说明函数的值(函数的返回值)是整型或字符型(系统自动按整说明)如果函数定义在调用函数之前,可以不必加以说明在函数说明和函数定义中:a)类型定义、函数名要相同b)形式参数标识符可以a)类型定义、函数名要相同b)形式参数标识符可以不相同{doubleabc(intxfloaty);/*函数说明*/-——abc}abcdouble函数体}

(inta,floatb /*函数定义a,bx,y/不使用函数说明例子非int形参的函数必须在调用前进行函数说明P148例8。3、8。5不使用函数说明例子例:main() floatabc(floatx,floaty){intsum,a=2b=5; x=x+y; 定sum=add(a,b);return(;义┄}}main()intadd(intx,inty){floatsum,a=2.0,b=5。0;{x=x+y;定义sum=abc(a,b;return(x);语句}}说明:使用库函数,一般在文件开头用#include即:#include“math。h"main(){…a=sqrt(x)即:函数即:函数定义函数定义函数的嵌套调用1)C语言函数不能嵌套定义各个函数定义是互相平行的函数定义3函数定义main()abbmain()abba返回结束返回*五、递归调用一的过程递归:由递归两部分组成即:一个递首先“回推”,然后在递归过程中,必须具有一个结束递归过程的条件例:N! 1 (N=0,1)递归公式=

个函数自己调用自己方式与递归终止条件归的问题可以分为:“递推”N*(N-1)! (N>1)子函数定义 求:4!longfac(intn) sum=fac(4);PAGEPAGE33{longfa;if(n==0)fa=1elsefa=n*fac(n-1);return(fa;}

件 (完整)C语言程序设计》教清华谭浩)第一步fac(4)fa=4*fac(4—1)=4*fac(3)fa=4*3*2*1*1第二步fac(3)fa=3*fac(3-1)=3*fac(2)fa=3*2*1*1第三步fac(2)fa=2*fac(2—1)=2*fac(1)fa=2*1*1第四步fac(1)fa=1*fac(1—1)=1*fac(0)fa=1*1第五步fac(0)fa=1回推回推递推六、函数参数的使用(实参或形参)递推实参:在调用函数中;形参:在函数定义中函数参数:1)数值2)变量3)数组元素4)数组名5)指针函数间的参数传递数值传递方式实参地址 形参地址调用函数的实参:给出主要是:1)数值2)变量3)(2)地址传递方式实参地址 形参地址主要是:调用函数实参:一般是数组名或指针变量2.数组有两种参数:数组元素:一个数组元素相当于一个变量,所以,数组元素可以用于函数参数,用与变量相同。 是传递数据方式数组名:数组名作为一个变量用于函数实参和形参,传递的是整个数组元素或部分据元素。 是传递地址方式(1)数组元素作实参的传值调用把数组元素当作变量来作为实参使用例:main()调用函数{inta[5];调用函数…a[0]=mul(a[1],a[4]);…}intmul(intx,inty){ints;…return(s);

函数定义(完整版)《C语言程序设计》教案(清华谭浩强)(完整版)《C语言程序设计》教案(清华谭浩强)PAGEPAGE72}(2)数组名作函数参数(实参与形参都用数组名具有:存贮地址作实参的传址调用例:(J5_3.C)main()a[2]={10.5,2。7};{voidswap(float2floata[2]={10.5,2。7};printf("%4。1f\t,%4。na);swap(a;printf(”%4.1f\t,%4。1f\n”,a[0,a[1;}voidswap(floatx[2]) 相当于: voidswap(x){floatt; {floatx[2];t=x[0];x[0]=x[1];x[1]=t;}说明:a)数组名在主调函数和被调函数中,分别进行定义,并且类型一致b)调用的实质:数组a和数组x数组a独享存贮区 共享存贮区 数组a独享存贮区10.52.72.710.510.52.72.710.52.710.5实参数组和形参数组大小可以不一致(C语言编译时,对形参数组大小不作检查,只是将实参数组的首地址传给形参数组这样两个数组共同占用同一段内存单元 )例(J5_4.C)main(){voidfun(floatx[4]);floata[4]={3.5,6.1,0。2,7.9;inti; a[0]a[1]a[2]fun(&a[1]23for(i=0;i<=3;i++)3.56.10。27.9printf(”%5。1f\t",a[i]);x[0]x[1]x[2]}voidfun(floatx[4]) 共用内存单元{x[0]=x[0]+1;x[1]=x[1]+1;x[2]=x[2]+1;} 结果:3.5 7。1 1.2 8.9数组a独享存贮区数组a和数组x共享存贮区aa[0] 3.5a[1] 7.1a[0] 3.5a[1] 6.1a[2] 1.2a[1] 7.1a[2]a[3]0.27.9a[3]8.9a[2]a[3]1.28.9注意:不要使用x[3],即:x[2]是子程序最后一个可用元素。例子

P164P164

P166P166二维数组作函数参数二维数组的传值调用与一维数组相似。例:main()调用函数{inta[3][5];调用函数…mul(n,a[1][2],a[0][4]);函数定义…函数定义}intmul(intx,inty,intz){ints;…例 (j5_8。main(){inttran(intn,intx[]);inttotal,a[4][4]={{3,8,9,10{2,5,-3,5{7,0,—1,4},{2,4,6,0}};tran(2,a); 0列地址9tran(2,&a[0]); 第一行的第0列地址9个tran(0,&a[2]); 第二行的第0列地址4计算数组元素在数组中的序号}计算数组元素在数组中的序号tran(intn,intarr[]){inti;for(i=0;i<4;i++)printf("%d,”,arr[n*4+i]);printf("\n";}程序输出:7,0,-1,4,7,0,-1,4,7,0,-1,4,七、局部变量和全局变量1.变量存储作用域作用域:决定一个变量的有效范围.a)作用域是整个程序的变量——为全局变量b)作用域只限于程序的一部分的变量—-为局部变量:-—在一个函数内部定义的变量(内部变量),它只在本函数范围内有效全局变量:-—在函数之外定义的变量称为外部变量 ,外部变量是全局变量P169有效范围为: 从定义变量的位置开始到本源文件结束。P169外部变量在文件开头定义,则在整个文件范围内都可以使用该外部变量。书P170作用: 增加函数间数据联系的渠道.P170P170八、变量的存储类型—2.变量的存储类别变量存在的长短:决定一个变量存在的范围(整个程序,部分函数)从变量存在的时间(即生存期)静态存储方式:指在程序运行期间分配固定的存储空间的方式动态存储方式:供用户使用的存储空间:程序区三个部分 程序区静态存储区:主要放全局变量动态存储区:主要放①函数形参变量。在调用函数时给形参变量分配存储空间.②局部变量(未加static说明的局部变量)③函数调用时的现场保护和返回地址在函数套眼调用开始时分配动态存储空间,函数结束时释放这些空间。(分配和释放是动态的)C语言中,变量和函数有两个属性:数据类型(如整型、字符型等)存储类型(数据在内存中存储的方法)C语言提供()①auto(自动) ②register(寄存器)③staic(静态) ④extern(外部C语言规定:存贮类型符放在变量定义的最前面即:staicinta,b;(1)自动变量(auto)定义在函数内部的变量,变量的建立与撤消是系统自动进行的.定义方式有:在函数体开始处定义、在复合语句中定义注:1)自动变量的存储类型符(auto)一般可省去。自动变量是一个局部变量,其值在一个函数的两次调用之间不能保持。例(j4_11.c)(2)静态变量(static)在整个函数调用期间都可以保存其值的变量(在函数调用结束后,其值不消失而保留原值,即占用的存储单元不释放)静态变量未初始化时,其值是零自动变量未初始化时,其值是随机的P173P173注:既:凡有statica)局限于本函数内(静态局部变量)b)局限于本文件内(P175例示例:(j4_15.c)如果把静态变量放在函数外面定义 称为静态外部变量,作用域为全局静态外部变量的全局性仅限于本程序,它的值不能在文件之间互传*(3)寄存器变量(register)存放于CPU的一个寄存器中的变量(在CPU中进行)可以把使用频率高的变量 定义为register,提高程序执行的速度.寄存器变量只能用于整型和字符型。CPU示例:书P175例8.19 (j4_12。c)目前P系列CPU自动分配*(4)外部变量(extern)外部变量主要用在:要在n个文件之间互访一批变量终存在.外部变量的作用域是整个程序(工程1)n一个程序中包含若干个文件,各个文件都要用到一些共用的变量时,就可以在一个文件中externn文件“全局”使用;同时,运算结果也可“共享"(外部变量开辟一条文件之间传递数据的通道)P176例8。202)作用域在一个程序中的外部变量定义变量的语句应放在变量作用域的开始处,而在引用这些变量的函数中,可以不再使变量说明。 示例:(j4_18.c)总结:P180局部变量:自动变量(autointa函数内定义静态局部变量(函数内):离开函数,值保留定义staticinta函数内定义寄存奇变量(函数内):离开函数,值消失定义registerinta函数内定义全局变量:静态外部变量(函数内,本文件)首字母大写使用static声明(可多次声明)定义erternintAstatic非静态外部变量(定义erternintA函数外定义变量存储时间动态存储:自动变量(本函数内存在)寄存奇变量(本函数内存在形式参数(本函数内存在)静态存储:静态局部变量(函数外存在)静态外部变量(函数外本文件内存在)非静态外部变量(函数外,项目内所有文件存在)变量存放位置内存中静态存储区:静态局部变量(本函数)静态外部变量(函数外部静态变量)非静态外部变量(其它文件可使用)内存中动态存储区:动态变量和形式参数CPU中的寄存奇:寄存奇变量*3.内部函数和外部函数内部函数:(称静态函数static即:static类型标识符函数名(形参表)外部函数:externP1828P182项目文件(prj):多*.C书P187书P187C宏定义 b)文件包含 c)条件编以“#"符号开头的行--为预处理的标志宏定义(宏替换)用预处理命令#define1)不带参数的宏定义用一个指定的标识符(即名字)来代表一个格式:#define标识符字符串例:#definePI 3。14159说明:a)用一个简单的名字代替一个长的字符串(PI代替“3。14159”)b)标识符(名字)称为“宏名”;)示例:#definePI3。14159 #defineR4。0main() 宏定义 #definePI3。14159{floatr,s;#defineSPI*R*Rprintf(“inputradius:”);main()程序scanf(“%f”,&r); {程序s=PI*r*rprintf(“S=%10。4f\n"printf(“s=%10。4f\n”,s); }s=PI*r*r

S);}运行结果:inputradius4 运行结果:S=50。s=50。2655宏名一般习惯用大写字母表示,与变量名相区别.(也可用小写字母C#define命令出现在程序中函数的外面;宏名的有效范围为:定义宏命令之后到本源文件结束。可以用#undef命令终止宏定义的作用域(实现部分有效)#defineH90main(){语句 H}#undefHf1(){语句}带参数的宏定义在字符串替换中,还要进行参数替换。格式:#define宏名(参数表)字符串例:#defineS(a,b)a*b…area=S(4,5;注意:区别它们的不同#definePI 3。14159 #definePI 3。14159#defineS(r)PI*r*r #defineS(r)PI*(r)*(r)… …area=S(a+b) area=S(a+b)调用结果:area=PI*a+b*a+b area=PI*(a+b)*(a+b)说明:a)宏定义时,字符串可以是任何类型的数据。即:#define CH CHINA (字符) CH为#define A 5.8 (数值) A为5.8#define S(r)PI*r*r (b)带参数的宏和函数是不同的。带参数的宏调用时,只是进行简单的字符替换。函数中的实参和形参都要定义类型,而类型要求一致;宏不存在类型问题,即宏名、它的参数无类型,只代表一个符号,展开时,带入指定的字符即可。示例:(J4_21。C)文件包含指一个源文件可以将另外一个源文件的全部内容包含进来用#include格式:#include“文件名”文件名:1)称为头部文件(header,常用字母“h”作为文件扩展名(用“c”作为文件扩展名也是可以的)2)使用标准库函数中的头部文件名

一个#include可以使用:#include#include#include“文件名”:可包含文件路径#include<文件名〉:只按指定的标准方式检索文件目录(常用第一种,)c)文件包含可以嵌套(1)用户定义的头部文件的使用用户定义的头部文件(p_format.h)#definePRprintf#defineNL”\n”#defineD”%d”#defineD1DNL#defineD2DDNL#defineD3DDDNL#defineD4DDDDNL#defineS"%s"程序调用中包含用户定义的头部文件(j4_31。c)#include”p_format。h"main(){inta,b,c,d;chargAa=1;b=2;c=3;d=4;PR(D1,a);PR(D2,a,b);PR(D3,a,b,c);PR(D4,a,b,c,d;PR(S,string);}标准库函数的头部文件的使用C400 400图形功能函数等。 #include要的函数如:#include“math。h”——-—表示主程序同26调用其中一个数学函数时,连接程序就把被调用的数学模块嵌入到程序中来。书P381 附录C库函数*3.条件编译对满足一定条件的语句行进行编译——称条件编译(一般情况下,源程序中所有的行都参加编译几种表示方法:#ifdef标识符#else#endif作用:如果标识符被定义过(用#define定义,编译程序段2#ifndef标识符#else#endif作用:如果标识符未定义过(没有用#define定义,编译程序段1;否则,编译程序段2#if1#else程序段22十、该章的主要例题P146例8。2 P148例8.3 P150例8。4 P152例8.5P164例8.10 P165例8.11 P166例8。13 例8.14例8。P175例8。18 P188例9.1 P190例9.3十一、该章的主要习题:P186 8。1 8.3 8。4 8.5 8。十二、该章的主要上机内容P146例8。2P164例8.10P1658。11P1668。13例8.14 例8。15例8.16P175例8。18P188例9。1P190例9.3其他:上机实验指导书中内容

例8.16*8。15根据变量名与地址的对应关系根据变量名与地址的对应关系先找到变量i的地址2000和j的地址2002第十章指针重点:①指针的概念及C语言指针使用的特点。②指针变量的定义、引用。难点:①指针的运算和使用.②指针在数组中的使用及使用特点。C能动态分配内存;即可以处理一批长度不确定的数据或一批动态变化的数据;在调用函数时能得到多个值;能直接处理内存地址。一.指针的概念整型 分配2个字节定义的变量,一般在内存中分配存储空间 实型 分配4个字节字符型为1个字节等。一个内存单元:可用内存单元地址与内存单元内容表示例:inti,j,k; 2000 3 变量2002 4 变量j2004 12 k3000 2000 p内存说明:1)变量的“直接访问 ”方式i,j,k如:printf(“%d"i)的执行:根据变量名与地址的对应关系,找到变量i的地址2000然后从由2000开始的地址中取出数据,把它输出(值为3)如:scanf(“%d”,&i)的执行:根据键盘输入的值,找到变量i的地址送到由2000开始的地址存储单元中。根据键盘输入的值,找到变量i的地址送到由2000开始的地址存储单元中。如:k=i+j的执行:然后从由2000开始的地址中取出数据值(3)2002(4)把它相加后和值(7)k2006这种按变量地址存取变量值的方式称为“直接访问"方式。2)变量的“间接访问”方式i的地址ii(3000),ii3。(P202比方)结论:如果一个变量专门用来存放另一变量的地址 称“指针变量如:p为指针变量3000 2000是指针(地址)2000p3000 2000 32000有: p 2000 *p=3 注:a“" 星号运算符(单目运算符)功能是返回指针所指变量的数值b)p 为指针变量,*p为指针变量所指的c)*运算符与&运算符的特点:*-—指针运算符 &-—取地址运算符优先级别相同,并且都是“右结合当p=&i时,可有:*p=3 或*&i=3二.指针的定义1.格式:类型标识符 *变量类型标识符——表示该变量所指向的变量类例:int *p;charfloat注:指针p,pc,pf放的是地址值,为整型数;而上面类型标识符,说明的是地址值所指向的数据类型即:*p=20 *pc=‘s’ *pf=12.32.指针变量的引用指针变量中:只能存放地址(指针)不能将一个整型量直接赋给指针变量。p=2000p 2000使用有关的两个运算符:&aapp例:main(){inta,b;int*p1,*p2;a=5;b=20p1=&a;p2=&b;“%d,%d\n”,*p1p12“%d,%d\n”,*p1p12p2地址相同p1=p2;printf(“%d,%d\n”,*p1,*p2);*p1=2;printf(“%d,%d\n",a,b);}输出:5,20p155,2020,205,2p220说明:*与&的组合使用&*p1:——有*p1a,那么,&*p1与&a相同*&a&aa*&a&p13.指针变量的运算1)算术运算只有:加、减每加(减)一,就指向它基本类型的下一个(上一个)元素的位置。每加(减)一,就指向它基本类型的下一个(上一个)元素的位置。例1:inta,b,c,d,*p1;变量内容指针地址p1=&b;a1998p1++;b2000有:pcp1=&cc2002如果p++改为p——d2004有:p1=&a,p1指向a变量例2:inta,b,c,d,*p1;x3000p1=&a;y3004p1=p1+2z3008有:p指向c变量,即p1=&cp120005000例3:floatx,y,z,*p2;p230006000p2=&x;p2=p2+2;有:p指向z变量,即p2=&z2)逻辑运算C语言允许指针变量进行逻辑运算例(j6_11.c)main(){int*p,*q,*r,x;inta=1,b=2,c=3;printf(\n%x,%x,%x\t\n,p,q,r;p=&a;q=&b;r=&c;printf("%x,%x,%x,%x\t\n”,p,q,r,p&&q&&r);printf(”%x\t”,(!p)?q:r);}输出:d6,55f,57effd8,ffda,ffdc,1ffdc(P206例10。2 P207例10。3)三.指针与数组P210一个变量可以有一个地址相对应,而一个数组包含若干个元素。每个数组元素都在内存中占用存储单元,同样有一个地址相对应。指针变量可以指向变量,所以也可以指向数组和数组元素即把数组起始地址或某一元素的地址放到一个指针变量中。数组的指针: 是指数组的起始地址(指第一个元素的地址数组元素的指针: 是指数组元素的地址。说明:引用数组元素 1)用下标法(即a[2]对应相应的地址)2)用指针法(通过指向数组元素的指针找到所需元素)1.指向数组元素的指针变量的定义与赋值与定义指针变量的方法基本相同定义:inta[5]; /*定义5个数组元素*/int*p; /*定义一个整型的指针变量*/指针变量的赋值:p=&a[0];或 p=a; /*数组名a代表数组的首地址*/在定义指针变量时可以赋给初值:假如:inta[5];int*p=a假如:inta[5];int*p=a;如果:*p=2a[0]2a[0]=2]a[1]如果:p=p+2;*p=2表示对a[2]赋值为2即a[2]=2a[2

200020022004说明:(1)如果p的初值为&a[0]则:a)p+ia+ia[i]的地址b)*(p+i)或*(a+i)p+ia+ia[i](2)指向数组的指针变量也可以带下标如:p[i]与*(p+i)等价所以,引用一个数组元素,可用:下标法,即:a[i]形式指针法,即:*(a+i)或*(p+i)P212例:用各种方法输出数组全部元素 P212例10.5设有一个数组a,输入、输出数组各元素的值有三种方法:1)下标法 2)通过数组名计算数组元素地main() main(){intinta[10;i;{intinta[10;i;for(i=0;i〈10;i++)for(i=0;i〈10;i++)scarf(“%d”,&a[i]); scarf(“%d",&a[i]printf(“\n”); printf(“\n”);for(i=0;i〈10;i++) for(i=0

温馨提示

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

评论

0/150

提交评论