(完整版)《C语言程序设计》教案(清华谭浩强)

阅读: 评论:0

2024年2月4日发(作者:)

(完整版)《C语言程序设计》教案(清华谭浩强)

(完整版)《C语言程序设计》教案(清华谭浩强)

第一章C语言及程序设计概述

本章要求:

了解C语言的特点、C语言与其它高级语言相比有什么异同;

了解C程序在PC机上的建立、编译和运行过程;

了解C语言程序设计思想的基本篇;

重点:①C语言的主要特点;

②C语言在PC机上的运行过程及上机操作过程;

③常用算法的应用

难点:无

一、C语言概述

C语言是目前国际上在各种计算机运行较为广泛流行的一种高级语言.

主要表现为:

C语言:适合于作为系统描述语言—-可用来写系统软件。

具有高级语言的特点,又有低级语言(汇编语言)的特点。

C语言:是AT&T贝尔实验室的Dennis Ritchie在1972年发明的。

C语言:是在B语言的基础上发展起来的.(ALGOL 60)

C语言:最早开始是用于UNIX操作系统。(C语言和UNIX是相辅相成的)

DBASE 、Microsoft Exel 、 Microsoft Word、PC—DOS等,则是用C语言加上若干汇编子程序编写的。

1983年:——制定的新标准,称为(美国国家标准化协会)ANSI C

1987年:—-Turbo C1.0 (Borland) 1988年:TC 1.5(图形和文本窗口)

1989年:——Turbo C2。0 (DOS操作系统、查错、Tiny模式生成com文件)

1991年:—-Turbo C++(3.0) 支持windows 3.X

说明:Turbo C语言可以在程序的任何地方嵌入汇编代码,提高速度,可以直接使用存储器和寄存器。

二.C语言的特点

1.语言简洁、紧凑、使用方便、灵活

C语言:——共有32个关键字,9种控制语句;

程序书写自由,主要用小写字母表示;

2.运算符丰富

C语言的运算符包含的范围很广泛,共有34种运算符;

即:把括号、赋值、强制类型转换都作为运算符处理

3.有丰富的数据类型

整型、实型、字符型、数据类型、指针类型、结构体类型、共用体(联合)类型等。实现复杂的数据结构(链表、树、栈、图)的运算。

4.具有结构化的功能,用函数作为程序模块,实现程序的模块化

5.语法限制不太严格,程序设计自由度大.(放宽了语法检查)

例:1)对数组下标越界不作检查,由程序编写者自己保证程序的正确;

2)整型数据、字符型数据、逻辑型数据可以通用。

6.能直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬

1

(完整版)《C语言程序设计》教案(清华谭浩强)

件进行操作。

7.生成目标代码质量高,程序执行效率高。

8.用C语言编写的程序,移植性较好。

说明:

C语言比其它高级语言难掌握,对编程人员要求较高

程序员使用C语言编写程序会感到限制少、灵活性大,功能强,可以编写出任何类型的程序.

三.C程序的构成

例:

main( ) /*主函数*/

{

int a,b,sum; /*定义变量*/

a=123;b=456;

sum=a+b;

printf(“sum is %dn",sum); /*输出变量*/

说明:

1)程序一般用小写字母书写;

2)每个程序必须要有一个main ( ) (只能一个),称主函数;

注:C程序是由函数构成的,函数是C程序的基本单位。

函数:系统提供的库函数;用户设计的函数。

3)程序体必须在{ }之间;

4)每个语句的结尾,必须要有“;”作为终止符。

5)用/*………。. */ 作注释

2

(完整版)《C语言程序设计》教案(清华谭浩强)

四、C程序的上机过程

1.演示 书:P5 程序

2.上机步骤 书:P7

注:C语言是一种编译语言,编译语言的特点:

编源程序

目标程序

*.OBJ

连执行程序

C编译程序 Link程序

3.DOS下C语言的运行

目前DOS下运行C语言软件为:Turbo C 2.0

(1) Turbo C 2.0 的特点:

是一个把 ①编辑 ②编译 ③连接 ④运行 等全部操作集中在一个界面上。

(2) Turbo C 2.0的操作及运行 书:P8

五、算法的概念

1.算法的概念 书:P13

算法:程序的操作步骤。

程序中的数据

在程序设计中: 操作步骤

有: 程序 = 数据结构 + 算法 沃思 Nikiklaus Wirth

程序=算法+数据结构+程序设计方法+语言工具和环境

2. 计算机算法分为两大类: ①数值运算算法 ②非数值运算算法

(1)数值运算算法:求数值解;通过运算得出一个具体值,如求方程的根等

注:数值运算一般有现成的模型,算法较成熟。

(2)非数值运算算法:用于事务管理,如图书检索、人事管理等。

3、常用简单算法

(1)累乘 即:1×2×3×4×5……×100

1×2 → S(结果)

S×3 → S(结果)

S×4 → S(结果)

S×100 → S(结果)

(2)累加 即:1+2+3+4+5……+100

1+2 → S(结果)

S+3 → S(结果)

S+4 → S(结果)

S+100 → S(结果)

(3)找最大值 5,2,4,12,9

3

(完整版)《C语言程序设计》教案(清华谭浩强)

5 → max (max 放最大值,后面的数都和它比较)

2 〉 max 不成立

4 > max 不成立

12 〉 max 成立:12 → max

9 〉 max 不成立

注:该算法可扩展为在一批数据中,找某一个数

(4)其它算法

P15 例 2。2 例 2。3 例 2。4 例 2。5 课余自学(必须)

4、算法的表示

常用的有:①自然语言②传统流程图③结构化流程图④伪代码⑤PAD图

(1)传统流程图

起止框 输入输出框 判断框 处理框 流程线 连接点

表示方法:P19 例

注:传统流程图对流程线的使用没有严格限制,难以实现结构化程序设计

为了限制流程线的滥用,提出三种基本结构:

①顺序结构 ②选择结构 ③循环结构

顺序结构 选择结构

f t 。 f

语句 表达式 表达式

t

语句 语 句 语 句1 语 句2

4

(完整版)《C语言程序设计》教案(清华谭浩强)

循环结构

表达式 语 句

语 句 表达式

a) “当型”结构 b) “直到型"结构

(2)N—S流程图

特点:去掉了带箭头的流程线,全部算法写在一个矩形框内.

称N-S结构化流程图

P

A

成立 不成立 当P1成立

A

B

A B A 直到P1成立

顺序结构 选择结构 循环结构

作业:p37 2。4

上机:熟悉Turbo C 2。0的操作及运行

5

(完整版)《C语言程序设计》教案(清华谭浩强)

第三章 数据类型、运算符与表达式

本章要求:

本章是C语言的基本概念开篇,所介绍的概念是学习C语言的基础;

要求熟练掌握数据类型、运算符与表达式。

重点:①C语言数据类型定义的方法和分类。

②C语言运算符、表达式的使用以及它们的主要特点。

难点:自增、自减运算符、赋值运算符、逗号运算符及它们的混合使用

一.数据类型

概念:算法处理的对象—-是数据,而数据是以某种特定的形式出现。

在C语言中,数据有:常量、变量;一般它们都有一定的数据类型。

(C语言的数据结构是以数据类型形式出现的)

1.数据类型分类:

整型 int

基本类型 字符型 单精度型 float

实型(浮点型)

枚举类型 双精度型 double

数据类型 数组类型

构造类型 结构体类型 struct

共用体(联合)类型 union

指针类型 *

空类型 void

说明:在程序中对用到的所有数据都必须指定其数据类型.

2.C语言中的常量和变量

常量:——在程序运行过程中,其值不能被改变的量。

变量:——在程序运行过程中,其值可以改变的量。

说明:1)常量和变量,都要有一个名字表示它;

习惯上,符号常量(别名)名用大写,变量用小写。

符号常量的定义为: #define P 30

其它常量:直接用数据表示 例: 23 45。5 ‘e’ 3e+2

2)在C语言中,对变量要先定义,后使用。

3)如果一个变量被指定为一确定类型后,在C语言编译时,就能为其分配相应的存储单元.

a 变量名

存储地址)2000 3 变量值

存储单元

地址的概念

3.常用的基本数据类型

(1)整型

6

(完整版)《C语言程序设计》教案(清华谭浩强)

1)整型常量:十进制整数 123,—11,0 非0开头

八进制整型 0123,—011 0开头

十六进制整型 0x11 0x20 0x0D 0XFF 0x4e 0x/0X开头

说明:在一个整常量后面加一个字母:l或L,是长整型常量。22L 0733L 0xae4l

2)整型变量:

定义 存储字节 数的范围

基本型 int x (2字节) -32768~32767

短整型 short int x (2字节) —32768~32767

长整型 long int x (4字节) -2,147,483,648~2,147,483,647

无符号型 unsigned int x (2字节) 0~65535

unsigned short x(2字节) 0~65535

unsigned long x (4字节) 0~4,294,967,295

注: 数据在内存中是以:二进制形式存放

如:9 为 00001001

例: x=13; x=015 ; x=0xD 存储结构 见P44 图3。5

注:数据超过数据范围,会发生数据溢出 例3。2、3.3

(2)实型(浮点数)

1)实型常量: 十进制整数 1.23 。0123

指数形式 1。23e3,1。00e—3

2)实型变量: 数的表示范围P46表3.2

单精度 float x (4字节)3.4x10-38~3。4x1038

TC默认 双精度 double x (8字节)1.7x10-308~1.7x10308

说明:实型常量

不分float和double,只有十进制表达方式

有的C编译系统64位存储方式,如尾加f或F可表示32位:324。567f

例:x=1。23; x=123e3 P47例3。4(存储精度)

(3)字符型

1)字符常量:

a) 用单引号括起来的一个字符 ‘a’‘A’

b) 转义字符(由“专用字母” ) 书P48表3。3 例3.5

0字符串结束符 n换行 t水平制表

ddd八进制数 xdd十六进制数

2)字符变量:

char c (1字节)

说明:一个字符变量,只能放一个字符常量。实际是把该常量的ASCII值,送入字符变量中。即:‘B'(66) c (字符变量)

书P374ASCII表 p50例3.6-7

c=‘B’ c的内容为66

故:字符数据可以进行算术运算;即:c=‘B’+2 为68

字符数据在内存中的存储方式 书P50

unsigned char 0—255 char -128-127 有符号数在TC中是用补码表示的

127(0x7f) 0111 1111 128(0x80) 1000 0000

复习:补码的规定:

正数:其原码、反码、补码相同

负数:最高位为1,其余各位为原码的反码(原码的相应位取反),然后对整个数加1。

7

(完整版)《C语言程序设计》教案(清华谭浩强)

140(0x8c) 1000 1100→1111 0011 + 1(取反加1)→1111 0100→—0x74

-0x74 1000 1011 + 1(取反加1) → 1000 1100 → 0x8c

(0x80为负数—74 高位为1)

3)字符串常量

用双引号括起来的字符 “a” ,“ABFD” “a" =“a0” <〉 ‘A’

说明:C规定,在每一个字符串的结尾应加一个“字符串结束标志”(0),

以便系统判断字符串是否结束.

4.各类数值间的混合运算

1)整型、字符型、单精度型、双精度型数据—-可以混合运算

2)字符型、整型——可以通用

规则: 高 double float

long

unsigned

低 int char,short

例如 10+’a'+1。5—8765。1234*’b’ -858873.593200 (TC默认6位小数)

10+97+1。5-8765.1234*98

二.运算符和表达式

C表达式:由变量、常量、函数等运算对象和运算符组成的式子

C运算符作用:

1)能把一些基本运算模块用单一的运算符处理

2)使用丰富的运算符,构成多种表达式

C运算符有优先级,优先级高的先执行,同级的由结合规则决定其处理规则

C运算符有两种结合规则:

1)从左到右的结合运算顺序;即:a=5+x-10;运算对象与左边运算符结合

2)从右到左的结合运算顺序;即:x=y=7;运算对象与右边运算符结合

C运算符分类 书P55

1.基本运算符(算术运算符)

C语言有7个基本运算符

1)单目运算符:(表示符号) 正号“+” 负号“—”

2)双目运算符:+、— 、*、/、%(模运算,求余运算,两侧为整数)

说明:

a)运算顺序的结合方向从左到右

b)求余(取模)运算符是对两个整数相除的余数,计算结果的符号与第一个数的符号相同。即:-5%3 值为-2、 -5%—3 值为—2、 5%—3 值为2

2.自增、自减运算符(优先级高于算术,右结合)

作用:——使变量的值增1或减1

++i(——i)——在使用i之前,先使i的值加1(减1),然后再使用i.

i++(i——)—-先使用i的值,然后再使i加1(减1)。

例:i =4;

j=++i; i 值为5,值为5; j=i++; i 值为5,j值为4

说明:1)自增、自减运算符++(-—),只能用于变量,不能用于常量或表达式

即:5++ 、 (a+b)++ —— 不合法

2)运算顺序的结合方向从右到左

8

(完整版)《C语言程序设计》教案(清华谭浩强)

例 例:

main(){

int i=3 z,x,y; z=(i++)+(i++)+(i++)

x=y=3;

//结果:z值为9 i值为6

z=x+++y;

//变量x右结合运算符++ (不是3+4+5=12)

printf("z=%d,x=%d,y=%d",z,x,y);

输出结果:z=6 x=4 y=3

如果:z= -x+++y; 输出结果:z=0 x=4 y=3 x先为-4,然后+y,最后x++

3.赋值运算符和赋值表达式(优先级低于算术,右结合)

(1)“=” ——赋值运算符

作用:将一个数据赋给一个变量 即:x=21

注意: 如果赋值运算符两侧的类型不一致,在赋值时,要进行类型转换。P61例3。9

即:float f ; f=23 f值为23.0000 符号位扩展

(2)复合的赋值运算符

“+=、-=、*=、/=、%=” —- 在赋值符“=”之前加上其它运算符

称复合运算符(也称为自反运算符)

例:a+=3 等价于 a=a+3

x*=y+8 等价于 x=x*(y+8)

y/=4 等价于 y=y/4

m%=3 等价于 m=m%3

说明:

C语言采用这种复合运算符:

为了简化程序,使程序精练;提高编译效率。

(3)赋值表达式

格式:变量=表达式

表达式:

可以是 1)常量、变量、算术表达式;

2)赋值表达式

即:a=(b=5) 或 a=b=5 (运算顺序的结合方向从右到左)

例:

a=b=c=6 ; a=5+(c=6) (结果a=11 c=6)

如果:a=3; 求:a+=a-=a*a; [有:1] a*a; 9 2)a= a-(a*a); -6 3) a+=-6 ] -6+-6

a为:-12 结果值为:-12

4.逗号运算符和逗号表达式(优先级最低,左结合)

用“,”将两个表达式连接起来。

格式:表达式1,表达式2 即: 3+5,6*9;

例: 3+5,6*9; 值为54

(先求解表达式1,再求解表达式2,最后逗号表达式的值为表达式2的值)

a=2*5,a*3; a值为10 结果值为:30 (先求:a=2*5,后求:a*3)

x=(a=2*5,a*3),a+4 a值为10 x值为30 结果值为:14

9

(完整版)《C语言程序设计》教案(清华谭浩强)

说明:

使用逗号表达式的目的,只是为了得到各个表达式的值(常用于循环语句)

解表达式1的结果可能影响解表达式2的值

5.强制类型转换运算符(优先级高于算术,右结合)

在要转换的数据前,用小括号括上要转换的数据类型

即: (int)x; (int)(a+b) (int)x+y

格式:(类型名)表达式

C一般会自动进行数据类型转换P56例3。8,用于不能自动转换的地方x%3(float f)

6.关系运算符和关系表达式(书P87)(优先级低于算术,左结合,高于赋值)

(1)6种关系运算符

< 〈= > >= (优先级高) = = != (优先级低)

(2)关系表达式

表达式 关系运算符 表达式

即:a>b a+b>=b+c (a=4)〈(b=8) ‘x’= = ‘y’

说明:

关系表达式值:是一个逻辑值,即:“真”或“假”

C语言:1 -— 代表“真” 0 —— 代表“假”

7.逻辑运算符和逻辑表达式(书P88)(优先级低于关系,左结合)

(1)3种逻辑运算符 p89 表5.1

&& (与) | | (或) ! (非)

(2)逻辑表达式

表达式 逻辑运算符 表达式 p89

即: (a〉b) | | (a+b>=b+c) (a=4)&&(b=8) 1 | | ∞ (1)

‘x’&& ‘y' 值为1 1

说明:

逻辑表达式值:是一个逻辑值,即:“真"或“假" p90

优先次序(由高到低):

!(非) 算术运算符 关系运算符 &&和| | 赋值运算符

求值短路:5>3&&2||8〈4-!0 1||∞ (结果1)

0&&∞ (结果0) 如:a&&b&&c a<〉0才判断a&&b

8.条件运算符(书P97)

格式:表达式1 ? 表达式2:表达式3

执行:先求解表达式1,为真(非零),求表达式2

为假(为0),求表达式3

例: y= ( a>b ) ? a : b;

说明:a)条件运算符要求有三个操作对象(称三目元运算符)

b)条件运算符优先于赋值运算符

y= ( a〉b ) ? a : b; 先求 ( a>b ) ? a : b 后赋值

c)条件运算符的结合方向为“自右至左”

( a〉b ) ? a : b 可写为: a〉b ? a : b

a〉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)(一般掌握)

10

(完整版)《C语言程序设计》教案(清华谭浩强)

位运算:-— 是对字节或字中的实际位进行检测、设置、屏蔽、移位.

位运算符:

& —— 位逻辑与 | ——位逻辑或 ^ —- 位逻辑异或

~ —- 位逻辑反 〉〉 —— 右移 〈〈 —— 左移

三、运算符小结

1.左结合方向的运算符

主要有:算术运算符、关系运算符、逻辑运算符、逗号运算符

2.右结合方向的运算符

主要有:自增、自减运算符、赋值运算符(复合的赋值运算符)、条件运算符

例:1) i=3; printf("%d,%d”,i,i++); 输出:4, 3

2) a=1;b=1;c=2; 求:a=b + = c* = 5; 输出:a为11 b为11 c为10

3) a>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的值9

3) x=4,y=7 求:y=y+++x-3 x的值4 y的值9

4) a=7,x=2。5,y=4。7 求:s=x+a%3*(int)(x+y)%*2/4 s的值2。500000

a%3*(int)(x+y)%*2 =》 1(整型) / 4 (整型) =》 0.25 =》0(整型)

5) a%3 && a%5 || a++〉++b

如:a=7, b=5 a的值8 b的值6 结果值1 1||1

如:a=15, b=15 a的值16 b的值16 结果值0 1||0

如:a=15, b=14 a的值16 b的值15 结果值0 0||0

如:a=15, b=13 a的值16 b的值14 结果值1 0||1

四、该章的主要例题

数: P39 例3。1 P44 例3。2 P44 例3。3

字符: P49 例3。5 P50 例3.6 P51 例3.7

五、该章的主要习题

P65 3.5 3.6 3。8 3.9 3.10 3。12

六、该章的主要上机内容

P39 例3。1 P44 例3。2 P44 例3。3 P51 例3。7

P65 3.6 3。8 3。10

11

(完整版)《C语言程序设计》教案(清华谭浩强)

第四章 简单的C程序设计(顺序程序设计)

知识点:

1、赋值语句; 2、字符数据的输入/输出;

3、格式输入/输出语句printf和scanf及其格式控制符;%c、%f、%d(输出宽度、对齐方式、其它格式控制符只作了解)

4、程序的结构框架。

重点:

1.赋值语句;

2.基本输入/输出语句printf和scanf及其格式控制符%c、%f、%d等的意义.

难点:

一、C程序结构

C程序

源程序文件1 源程序文件2 源程序文件n

预编译命令 函数1 函数n

说明部分 执行部分 (语句)

语句的分类P67 P68

1、控制语句

①条件:if else

②循环:for()

③循环:while()

④循环:do while()

⑤循环结束:continue

⑥终止循环或switch:break

⑦多分支:switch

⑧转向:goto

⑨函数返回:return

2、函数调用语句

printf(“a=%d",a);

3、表达式语句

i=i+1 表达式 i=I+1; 表达式语句 函数调用也可以认为是表达式语句

4、空语句:一个“;”

5、复合语句(用{}:分程序)

12

(完整版)《C语言程序设计》教案(清华谭浩强)

{ x=3; x=x+1;

print(“x=%x”,x)

二.赋值语句

变量名=表达式

注:是组成顺序结构的主要语句。

a=b; if ( max〈= x ) max =x ;

三.基本输入/输出语句

C语言本身不提供输入输出语句,输入输出操作是由函数来实现。

即:printf putchar scanf getchar

注:(1)这些函数构成一个标准的I/O函数库(放在“stdio。h”中)

(2)如果要使用C语言库函数,要用预编译命令“#include”将有关“头文件”包括到用户源文件中。

#include 〈stdio。h> #include “stdio。h”

当前目录 当前定义的目录中寻找

1.printf函数 —— 格式输出函数

格式:printf(格式控制,输出表列)

格式控制:—— 用双引号括起来的字符串,也称为“转换控制字符串”

printf的格式字符 书P77 表4.1

输出表列:—— 需要输出的数据、表达式

即:printf( “x=%5.1f, y=%d, z=%c” , x, y, z )

d,i 带符号十进制形式

u 无符号十进制形式 例3—3

c 字符形式

s 字符串形式

f 实数(小数)形式 默认6位小数

说明:1)printf( “ y=%-4d” , y ) 输出数据左对齐(默认为右对齐)

2)数据输出长度的修正;

l —— 输出长整型或双精度数据 即:printf( “%ld, %lf ” , i, y )

h —— 输出短型数据 即:printf( “%hu ” , a )

—m。n m最小宽度 n小数(实数) —左对齐

2.putchar函数 —— 字符输出函数

向终端输出一个字符

格式:putchar(变量) putchar(x)

putchar(“n" ) 输出一个换行符

3.scanf函数 -— 格式输入函数

格式:scanf(格式控制,地址表列)

格式控制:—— 用双引号括起来的字符串,也称为“转换控制字符串”

scanf的格式字符 书P80 表4.3

地址表列:—— 由若干个地址组成的表列,有:变量地址 &x

字符串的首地址

13

(完整版)《C语言程序设计》教案(清华谭浩强)

& —— 地址运算符

功能:求变量的地址(只能用于变量)

&x —— 表示x变量值的内存单元的地址

即:scanf( “%d, %4d”, &a, &b )

说明:1)不带分隔字符的方式,系统将自动按格式说明截取数据

例: scanf ( “ %4d%*3d%f ", &I , &p );

输入:12345678.93 时 得 I=1234 , p=8.93

“*"——作用是“虚读”,跳过相应的数据

2)带分隔字符的方式(分隔字符:空格、tab、回车、逗号)

即:scanf( “%d, %d”, &a, &b )

4.getchar函数 —— 字符输入函数

从终端输入一个字符

格式:getchar ( ) 即:c=getchar ( )

函数值是从输入设备得到的字符

四、该章的主要例题

1已知矩形的两边长,求矩形的面积、周长

2大小写字母互相转化

3教材P83的例子

五、该章的主要习题 P84 4。5~4.9

14

(完整版)《C语言程序设计》教案(清华谭浩强)

第五章

选择结构程序设计

知识点:

1、关系、逻辑运算符、逻辑真/假;

2、关系表达式、逻辑表达式;

3、分支的概念及其算法描述;

4、三种IF分支语句;

5、条件运算符;

6、SWITCH语句。(了解)

重点:

1、关系、逻辑运算符、逻辑真/假;

2、关系表达式、逻辑表达式;

3、三种IF分支语句.

难点:

1、逻辑真/假;

2、关系、逻辑运算优先级.

一、关系表达式及逻辑表达式在分支选择结构的作用

在程序设计中,表示一些复杂的条件

1、关系运算符及关系表达式(第三章)

2、逻辑运算符及逻辑表达式(第三章)

3、条件运算符(第三章)

二.分支语句(书P91)

从一个条件表达式中,选择语句的执行 (用 if 语句或switch 语句来实现)

f 。 t 。 f

表达式 表达式

t

语 句 语 句1 语 句2

1.If 语句

(1)C语言提供三种形式的if语句

1)if (表达式)

语句

例: if (x>y ) printf ( “%d” , x ); 注意“;”位置

2) if (表达式)

语句1 else

语句2

例: if (x>y )

printf ( “%d” , x );

else

printf ( “%d” , y ); 注意分号“;”

3) if (表达式1)

语句1

15

(完整版)《C语言程序设计》教案(清华谭浩强)

else if (表达式2)

语句2

else if (表达式3)

语句3

……

else if (表达式n)

语句n

else

语句n+1

例:p92图5。6

(2)if ()和else后的执行语句可以使用复合语句 {}

例5.1、5.2 p93 if结构 将输入的三个数从大到小排列输出

例5.3 p95 if 嵌套结构 计算函数值

(3)用条件运算符代替if语句

例: if ( a>b )

y=a; 条件运算符

else 可以用: y= ( a〉b ) ? a : b;

y=b;

例5.4 p98 条件运算符代替if 结构 将输入字符中的大写转换成小写输出

2.switch语句(了解)

switch语句——是多分支选择语句

表达式

语句1 语句2 语句3 语句 4

格式: switch (表达式)

表达式=常量表达式n 执行语句n

{ case 常量表达式1 :语句1;

break;

case 常量表达式2 :语句2;

break;

case 常量表达式3 :语句3;

break;

case 常量表达式n :语句n;

break;

default :语句n+1;

例:四级(ABCD)转化成百分制

#include

main()

{char grade;

scanf(”%c”,&grade);

switch(grade)

{ case ’A’:printf(”85~100n");break;

16

(完整版)《C语言程序设计》教案(清华谭浩强)

case 'B':printf(”75~84n");break;

case ’C':printf(”60~74n”);break;

case 'D’:printf(”<60n”);break;

default:printf(”errorn”);}

}

例:百分制成绩转化成五级(ABCDE)五级记分 5—4-1

三、程序举例

例5.7 p103 运费计算(自学)

p101 例5。6 求一元二次方程根(自学)

p100 例5。5 判断某一年是否是闰年(自学)

五、该章的主要习题 P104 5。3~5.10

该章的主要上机内容

P91 例5。2、P100 例 5。5,P101 例5.6

P104 习题5。5、5.6、5。9 其他:上机实验指导书中内容

17

(完整版)《C语言程序设计》教案(清华谭浩强)

第六章 循环结构程序设计

知识点:

1、循环的概念及其算法描述; 2、goto循环;

3、while循环;重点 4、do—while循环;重点

6、for循环;重点 难点 7、break、continue语句;

8、各种循环结构中的执行循环体、判断循环条件的顺序;重点

9、各种循环结构在一定条件下的转化。重点 难点

一、循环结构的概念

循环语句主要用于:重复执行的操作

1.C语言在实现循环过程-—可使用以下语句:

a) 用goto 语句和if 语句构成循环 b) 用while语句

c) 用do—while语句 d) 用for语句

2.循环可分为二种类型结构:

a) “当型"结构 b) “直到型”结构

语句

语句

二.循环语句

1.用goto语句和if语句构成的循环

(1)goto语句——无条件转向语句

格式:goto 语句标号

语句标号:用标识符表示

例:goto next; 如: goto 123 ;(不合法) (2)goto 和if语句构成循环

一般较少使用(不符合结构化原则)

50例:求

2n main( )

i { int i , sum=0 ;

i=1 ;

loop: if ( i〈=50 )

{ sum=sum+2*i ;

i++ ; goto loop ; }

18

(完整版)《C语言程序设计》教案(清华谭浩强)

printf ( “%dn" , sum ) ;

}

2.while语句 -—实现“当型"循环结构

格式:while ( 表达式 ) 语句

例:求

2n main( )

i50 { int i , sum=0 ;

i=1 ;

while (i<=50 )

说明: { sum=sum+2*i ; i++ ; }

printf ( “%dn” , sum ) ;

语句可为复合语句(用{ }构成) }

3.do—while语句 —-实现“直到型”循环结构

格式: do 语句

while (

表达式 );

例:求

2n main( )

i50 { int i , sum=0 ;

i=1 ;

do

{ sum=sum+2*i ;

i++ ; }

while (i<=50 ) ;

printf ( “%dn” , sum ) ;

}

do while 和while比较 p109 例6.4

4.for 语句

可以用于循环次数已知和循环次数不确定 (可以代替while语句)

(应用广泛,而且使用较活)

格式:for (

表达式1 ;

表达式2 ; 表达式3 ) 语句

过程:

表达式1

F

表达式2

T

说明:

语 句 表达式1-——-—循环变量赋初值

表达式2——-—-循环结束条件

表达式3 表达式3—————循环变量增值

19

(完整版)《C语言程序设计》教案(清华谭浩强)

即:for (循环变量赋初值 , 循环结束条件 , 循环变量增值 ) 语句

例:求

2n for ( i=1 ; i〈=50 ; i++ ) sum=sum+2*i;

i50 for语句的其它表示

(1)

用while 来表示 表达式1

while ( 表达式2 )

{ 语句

表达式3;

(2) 表达式可以省略,但分号不能省略

a) 省略表达式1

i=1

for ( ;i〈=50 ;i++ ) sum=sum+2*i

b) 省略表达式2——产生死循环

for ( i=1; ;i++ ) sum=sum+2*i

c) 省略表达式3

for ( i=1;i〈=50 ;)

{ sum=sum+2*i;

i++;

d) 省略表达式1 , 省略表达式3

i=1 i=1

for ( ;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) 循环体语句可使用break 和continue语句

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个数

F1=1 (n=1)

F2=1 (n=2)

Fn=Fn—1+Fn-2 (n〉=3)

4。p115 例 6。8判断m是否是素数

5.p115 例 6.9 求100—200间的所有素数

20

(完整版)《C语言程序设计》教案(清华谭浩强)

6.例 求任意输入10个数中的最大数6-max

四、该章的主要习题

P120 6.1~6.15

五、该章的主要上机内容

P115 例6.5、例6。6、例6.7、例 6.9

P120 习题6。4、6.7、6。9、6。11、6。14

其他:上机实验指导书中内容

作业解答:

5-8利润提成:类似所得税

21

(完整版)《C语言程序设计》教案(清华谭浩强)

第七章 数组

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] , b[2][2]

注意:a)数组名后,用方括号;下标从0开始。

b)下标值——可以是常量表达式

常量表达式:包括常量和符号常量(用#define定义的),但不能包含变量。

C语言:不允许数组进行动态定义。

即: int n ;

scarf(“%d”,&n);

int x[n]; /*定义数组 */

c)数组分为:一维、二维等,主要由下标值的多少来确定.

二.一维数组

1.定义

格式: 类型说明符 数组名[常量表达式]

类型说明符:——表示数组的类型

int , short , long , unsigned , float , double , char等

数组名: ——表示各数组元素的统一名字,定义方法和变量名相同

22

(完整版)《C语言程序设计》教案(清华谭浩强)

常量表达式:——表示数组的长度

即:int a[10]

注意:C语言不提供数组下标越界的保护,设计时要注意。

2.数组元素的初始化

数组在定义的时候,同时,可对数组元素进行初始化

格式: static int a[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值。

即:int a[10]={0,0,0,0,0,0,0,0,0,0};

等价于: static int a[10] ;

2)对全部数组元素赋初值,可以不指定数组长度。

即: static int a[ ]={0,1,2,3,4,5};

等价于: static int a[6]={0,1,2,3,4,5} ;

3)可以部分赋初值

即: int a[5]={1,3};

3.数组元素的引用

C语言规定:只能逐个引用数组元素,而不能一次引用整个数组。

4.程序举例

书P124 例7。2 例7。3

三.二维数组和多维数组

1.定义

格式: 类型说明符 数组名[常量表达式] [常量表达式]

类型说明符:——表示数组的类型

int , short , long , unsigned , float , double , char等

数组名: ——表示各数组元素的统一名字

常量表达式:——表示数组的长度

即:int a[5] [6]

说明:

a)每一维的下标从0开始,整个数组元素为:5×6=30个

b)C语言中,二维数组中元素排列的顺序是按行存放。

即:先存放第一行的元素,再存放第二行的元素

3 4 5 存储单元

3 a[0] a= 6 7 8 对应表:

[0] 4 a

1 2 9 →

[ 5 a0][1[]0]

[2 6

] a[1]

[ 7

0] a

[ 8 a1][1[]1]

[2 1

] a[2]

[ 2

0] a[2]

[ 9

1] a[2]c)可以计算数组元素在数组中的序号

[2]

23

(完整版)《C语言程序设计》教案(清华谭浩强)

假设 m×n的数组a,

计算a[i][j]序号的公式: i×n+j

如:a[0][1] 0×3+1=1(第二个) 如3×3

a[1][2] 的序号是: 1×3+2=5

a[2][2] 2×3+2=8

d)多维数组的定义

格式: 类型说明符 数组名[常量表达式] [常量表达式] [常量表达式]

即: 类型说明符 数组名[长度1] [长度2] [长度3] …

int a[2] [3][4]

2.二维数组初始化

1)两种基本方法:

(a)分行给二维数组赋初值

static int a[2][3]={{1,2,3},{5,6,7}}

(b)所有数据写在一个化括弧内

static int a[2][3]={1,2,3,5,6,7}

2)可以对部分元素赋初值

static int a[2][3]={{1},{3}}

即: 1 0 0

3 0 0

static int a[3][4]={{1},{3,1},{0,0,9}}

即: 1 0 0 0

3 1 0 0

0 0 9 0

3)定义数组时,第一维的长度可以不指定,但第二维的长度要指定(编译系统自动计算).

static int a[ ][3]={1,2,3,4,5,6,7,8,9}

等价于: static int a[3][3]={1,2,3,4,5,6,7,8,9}

static int a[ ][4]={{1},{3,1},{0,0,9}}

等价于: static int a[3][4]={{1},{3,1},{0,0,9}}

4.程序举例

书P128 例7。4 二维数组行列转换

例7.5 3×4矩阵求最大元素及行列号

四.字符数组

存放字符数据的数组;每一个元素存放一个字符.

1.定义

char 数组名[常量表达式]

即:char c[10];

说明:由于字符与整型是互相通用的,可使用 int c[10] ; 定义。

2.字符数组的初始化

24

(完整版)《C语言程序设计》教案(清华谭浩强)

1)static char c[5]={‘a', ‘b’, ‘c’, ‘d’, ‘e'};

注意:static char c[5]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’}; ( 错误,多一个元素)

static char c[5]={‘a’, ‘b’, ‘c’}; (正确) 后面元素自动定为空格

2)static char c[ ]={‘a’, ‘b', ‘c’, ‘d’, ‘e’};

系统自动根据初值个数确定数组长度

3.字符数组的引用

一个字符数组元素,代表一个字符.

即:x=c[2] x的值为“c"

4.字符串的使用

C语言中,将字符串作为字符串来处理。

规定:一个“字符串结束标志”,以字符‘0',在遇到字符‘0'时,表示字符串结束。

1)使用字符串常量进行数组初始化

static char c[ ]={“I am happy"};

或 static char c[ ]=“I am happy”;

等价于 static char c[ ]={‘I', ‘ ‘, ‘a', ‘m’, ‘h’, ‘a’, ‘p’, ‘p’,

‘y’,’0’};

注:(a)系统对字符串常量自动加一个‘0’

(b)字符数组并不要求它的最后一个字符为‘0’

2)数组长度始终保证大于字符串实际长度

static char c[10]={“ABCDE”}; (第5个元素0,第6个开始为空字符ASCⅡ为0)

static char c[10]={‘A’, ‘B’, ‘C’, ‘D’, ‘E'}; (后面5个元素为空字符ASCⅡ为0)

例7—6 P131:字符数组引用

例子 打印图形 (J5_1.C)

#define NL printf("n")

main()

{ char a[10]={'*’,’*','*’,’*','*',’*','*',’*’,'*',’*'};

int i,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.字符数组的输入输出

1)两种方法:

a)逐个字符输入输出。 用格式符“%c”进行 scanf ( “%c”, &c[i]);

25

(完整版)《C语言程序设计》教案(清华谭浩强)

b)整个字符串一次输入输出。 用格式符“%s”进行

例: static char c[ ]={“abcde”};

printf(“ %s” , c ) ; (为数组名,不能为“ %s” , c[0])

2)可以用scanf 函数输入一个字符串

static char c[6];

scanf ( “%s”, c );

注意:键盘输入不能超过5个字符

c不用加地址符&,即&c;因数组名代表数组的起始地址

6.字符串处理函数

在C的函数库中提供了一些用来处理字符串的函数

(1)scanf 和printf函数在字符串的使用

使用scanf和printf函数对字符串的处理时,调用语句中的输入或输出项使用的是字符数组名。(即使用字符数组名的首地址)

例:main ( ) (j5_9。c)

{ char s1[3] , s2[5];

scanf(“%s%s”,s1 , s2 );

printf(%sn%sn”, s1 , s2 );

}

输入:

ABC DEF HK (即:希望s1=“ABC ” s2=“DEF HK"

输出:

ABC

DEF

说明:C语言规定,scanf函数遇空格或回车就结束本次输入。

(2)puts函数

格式:puts(字符数组)

即: puts(str)

将一个字符串str(以‘0’结束的字符序列)输出到终端

(3)gets 函数

格式:gets(字符数组)

即: gets ( str )

输入:abcde

读取字符串并把它们依次放到str指向的字符数组中去.

得到一个函数值,该函数值是字符数组的起始地址。

str是字符数组的首地址,它读取字符串直到遇到换行符或EOF。

换行符或EOF不进入字符串,被转换为“0”,作为字符串结束符

(4)strcat函数

strcat( str1 , str2 ); str1,str2是字符数组

连接两个字符数组中的字符串,把str2接到str1的后面,结果放在字符数组str1中.

例:static char str1[20]={“ABCD EF”}

static char str2[ ]={“gggg”}

执行strcat(str1,str2)的结果为:ABCD EFgggg 书P136

(5)strcpy函数

strcpy( str1 , str2 ); 功能:把str2的内容复制到str1中

26

(完整版)《C语言程序设计》教案(清华谭浩强)

例:strcpy( str1 , “abcd” );

strcpy( &a[n] , &a[n+1] ); 作用:将n个字符以后的字符顺序地向前移动一个序号。

说明:a ) str1>=str2

b ) str1必须是数组名,str2可以是数组名或字符串常量

c ) 可以解决字符串常量不能赋值给字符数组

即:str1={“abcde"} ; str1=str2; (不合法) 可用strcpy(str1,str2)

注:strcpy(str1,str2,2); 是将str2中前面2个字符拷贝到str1中去,然后再加一个‘0’。

(6)strcmp函数

strcmp( str1 , str2 );

功能:把str1与str2的内容进行比较(按ASCII码的大小进行比较)

如果:str1=str2,则函数返回0

如果:str1>str2,则函数返回正整数

如果:str1

(7)strlen函数

strlen( str ) 测试字符串长度,不包括‘0’

(8)strlwr函数

strlwr ( str ) 将字符串中大写字母换成小写字母

(9)strupr函数

strupr ( str ) 将字符串中小写字母换成大写字母

7.程序举例:书P138 例7.8 例7.9

五、该章的主要例题:例7。1、例7.2、例7。3、例7。4、例7。5、例7。6、例7.8、例7.9

六、主要习题:7.1、*7.2、7.3、7.5、7.6、*7。9、7。11、*7。13

七、主要上机内容:例7.2、例7.3、例7。4、例7。5、例7.7、例7。8、7。1、7.3、*7。9、7。11

其他:上机实验指导书中内容

27

(完整版)《C语言程序设计》教案(清华谭浩强)

第八章 函数与程序结构

1、函数的一般概念:函数形参、实参、返回值,函数的类型;

2、动态存储变量与静态存储变量 3、变量的生存期与作用域

重点:①函数的定义和调用及使用函数的特点。

②函数间的参数传递(值传递和地址传递).

③变量存储作用域、编译预处理的使用。

难点:①函数参数传递(数值、地址)及形参、实参的使用;

②变量存储作用域及自动变量与静态变量的区别.

一、函数概述

一个较大的程序:可由若干程序模块组成,每一模块用来实现一个特定的功能。

—-用子程序可实现该模块功能。

-—在C语言中:子程序称为:子函数

在C程序中: 可由一个主函数和若干个函数构成。

分为标准库函数和用户自定义函数

函数的作用: 减少重复编写程序段的工作量.

语句

功能

语语句

调用

语功标准库函数: 由C语言预先编写的一系列常用函数(系统提供)

Turbo C 的标准库——包含400多个常用函数

用户自定义函数:

一般自定义函数和自定义函数库(用户先已编好的)

二、函数定义(子函数的设计)

1.函数定义

格式: 类型定义符 函数名(形式参数表列)

{ 函数体 }

说明:1)类型定义符:函数返回值的数据类型

a) int , char , float , double 默认int

b) 函数无数据返回,使用 void 作类型定义符

2)函数名:函数的名称(用户取的:合法的标识符)

3)形式参数表列:函数调用时传递信息的通道

有两种表示方法: a)(参数说明 形式参数)

传统风格

b) (形式参数)

28

(完整版)《C语言程序设计》教案(清华谭浩强)

参数说明

例: float add( float x , float y ) float add( x , y )

{ x=x+y; { float x , y ;

return (x) ; x=x+y ;

} return (x);

a). b)

2.函数的返回值

一般通过函数中的return语句获得。

如果不需要返回值,可以不要return语句.

为了明确表示“不带回值”,可以用“void”定义“无类型"

例: main ( ) /*(打印平方表)*/

{ void prin ( int x ) ;

int i ;

for ( i=1 ; i〈=10 ; i++) prin ( i ) ;

void prin ( x )

int x ;

{

printf(“%dt%dn",x,x*x);

}

三、函数间的参数传递

在一个主调函数调用一个子函数时,须把主调函数的参数传递给子函数,称该参数为“实际参数”.

实参可以是常量、变量、表达式 实参应和形参类型相同或相容

P146 例8。2 (主函数) c=max(a , b); (子函数) max(int x , int y)

参数传递

形式参数

实际参数

(1)数值传递方式

特点:实参通过复制的方式传递给形参(占用不同的内存空间)

实参地址 2 形参地址

a x

调用函数的实参:给出具体数据

(2)地址传递方式

特点:参数传递不是数据本身,而是数据的地址(使用同一地址空间)

实参地址 形参地址

调用函数实参:一般是数组名或指针变量

四、函数调用及值的返回

1.函数调用

格式: 函数名 (实参表列);

调用的过程:

a)通过函数名,找到定义的函数

b)将实际参数传递给被调函数的形式参数

29

(完整版)《C语言程序设计》教案(清华谭浩强)

(实际参数与形式参数一一对应,既一一传递数据)

许多C版本是按自右而左的顺序求值

例:P150 例8。4

main ( )

{ int i=2, p;

p=f(i, ++i) ; /* f为f(3, 3) */

printf ( “%d" , p );

int f(int a , b)

{ int c;

if (a〉b) c=1;

else if (a= =b) c=0;

else c= —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

2.函数调用的几种方式

30

(完整版)《C语言程序设计》教案(清华谭浩强)

(1)函数语句 把函数调用作为一个语句,即单独一个语句行.

不要求函数带回值,只要求函数完成一定操作。

即:printstar( );

(2)函数表达式 函数出现在一个表达式中,要求函数带回一个确

定的值以参加表达式的运算。

即:c=2*max( a, b );

(3)函数参数 函数调用作为一个函数的实参;

即:m=max(a,max(b, c));

3.函数说明

作用:在函数使用前对函数的特征进行说明的语句.(用户自定义函数)

对已定义的函数的返回值进行类型说明。

告诉系统在本函数中将要用到的函数是什么类型。

C语言规定:以下几种情况可以不使用函数说明

a)函数的值(函数的返回值)是整型或字符型(系统自动按整说明)

b)如果函数定义在调用函数之前,可以不必加以说明

在函数说明和函数定义中:

a)类型定义、函数名要相同

b)形式参数标识符可以不相同

如:main ( )

{

double abc ( int x , float y ) ; /*函数说明*/

-——

double abc ( int a , float b ) /*函数定义 a,b与x,y不同*/

函数体

非int形参的函数必须在调用前进行函数说明P148 例8。3、8。5

不使用函数说明例子

31

(完整版)《C语言程序设计》教案(清华谭浩强)

例:main ( ) float abc ( float x , float y )

{ int sum , a=2 , b=5; { x=x+y ; 定

sum=add( a , b ) ; return(x); 义

┄ }

} main ( )

int add( int x , int y ) { float sum , a=2.0 , b=5。0;

{ x=x+y; 定义 sum=abc( a , b );

return (x) ; 语句 }

说明:使用库函数,一般在文件开头用#include命令

即:#include “math。h"

main ()

{ …

a=sqrt(x)

… }

4.函数的嵌套调用

1)C语言函数不能嵌套定义 即: 函数定义

函数定义

函数定义1

函数定义2 各个函数定义是互相平行的

函数定义3

2)C函数允许嵌套调用,即在调用一个函数的过程中,又调用另一个函数。

示例:

main ( ) a函数 b函数

*五、递归调用

调用b函数

一调用a函数

的过程

递归:由递归

两部分组成

返回

即:一个递结束 返回

首先“回推”,然后 在递归过程中,必须具有一个结束递归过程的条件.

例:N! 1 (N=0, 1)

递归公式=

N*(N-1)! (N>1)

子函数定义 求:4!

long fac( int n ) sum=fac(4);

个函数自己调用自己方式与递归终止条件归的问题可以分为:“递推”

32

{ long fa;

if (n= =0) fa=1

else

fa=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.函数间的参数传递

(1)数值传递方式

实参地址 形参地址

调用函数的实参:给出具体数据

主要是:1)数值 2)变量 3)数组元素

(2)地址传递方式

实参地址 形参地址

主要是:调用函数实参:一般是数组名或指针变量

2.数组有两种参数:

a)

数组元素:一个数组元素相当于一个变量,所以,数组元素可以用于函数参数,用法与变量相同。 是传递数据方式

b)

数组名:数组名作为一个变量用于函数实参和形参,传递的是整个数组元素或部分数据元素。 是传递地址方式

(1)数组元素作实参的传值调用

把数组元素当作变量来作为实参使用

传值调用最多返回一个值

例: main ( )

{ int a[5];

调用函数

a[0]=mul( a[1] , a[4] ) ;

函数定义

}

int mul(int x , int y )

{ int s ;

return( s );

33

(完整版)《C语言程序设计》教案(清华谭浩强)

}

(2)数组名作函数参数(实参与形参都用数组名)

具有:存贮地址作实参的传址调用

例: (J5_3.C)

main ()

{ void swap(float x[2]);

float a[2]={10.5,2。7};

printf("%4。1ft,%4。1fn”,a[0],a[1]);

swap(a);

printf(”%4.1ft,%4。1fn”,a[0],a[1]);

void swap(float x[2]) 相当于: void swap( x )

{ float t; { float x[2];

t=x[0];x[0]=x[1];x[1]=t;

说明:a)数组名在主调函数和被调函数中,分别进行定义,并且类型一致。

b)调用的实质:

数组a和数组x

数组a独享存贮区 共享存贮区 数组a独享存贮区

10.5 2.7 2.7

2.7 10.5 10.5

c)实参数组和形参数组大小可以不一致

(C语言编译时,对形参数组大小不作检查,只是将实参数组的首地址传给形参数组,这样两个数组共同占用同一段内存单元)

例 (J5_4.C)

main ()

{ void fun(float x[4]);

float a[4]={3.5,6.1,0。2,7.9};

int i; a[0] a[1] a[2] a[3]

fun(&a[1]);第2个的开始连续3个地址

for (i=0;i<=3;i++) 3.5 6.1 0。2 7.9

printf(”%5。1ft",a[i]); x[0] x[1] x[2]

void fun(float x[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和数组x

数组a独享存贮区 共享存贮区 数组a独享存贮区

a[0] 3.5 a[1] 7.1 a[0] 3.5

a[1] 6.1 a[2] 1.2 a[1] 7.1

a[2] 0.2 a[3] 8.9 a[2] 1.2

a[3] 7.9 a[3] 8.9

34

(完整版)《C语言程序设计》教案(清华谭浩强)

注意: 不要使用x[3] , 即:x[2]是子程序最后一个可用元素。

(3)例子

书P164 例8。10 例8。11 例8.12 书P166 例8.13

(4)二维数组作函数参数

二维数组的传值调用与一维数组相似。

例: main ( )

{ int a[3][5];

调用函数

mul( n , a[1][2] , a[0][4] ) ;

函数定义

int mul(int x , int y , int z )

{ int s ;

例 (j5_8。c)

main ()

{ int tran(int n,int x[]);

int total,a[4][4]={{3,8,9,10},{2,5,-3,5},{7,0,—1,4},{2,4,6,0}};

tran(2,a); 第一行的第0列 地址 9个

tran(2,&a[0]); 第一行的第0列 地址 9个

tran(0,&a[2]); 第二行的第0列 地址 4个

}

计算数组元素在数组中的序号

tran(int n,int arr[])

{ int i;

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.变量存储作用域

(1)作用域:决定一个变量的有效范围.

a)作用域是整个程序的变量——为全局变量

b)作用域只限于程序的一部分的变量—-为局部变量

局部变量:-—在一个函数内部定义的变量(内部变量),它只在本函数范围内有效。

全局变量:-—在函数之外定义的变量称为外部变量,外部变量是全局变量

35

(完整版)《C语言程序设计》教案(清华谭浩强)

(2)有效范围为: 从定义变量的位置开始到本源文件结束。

书P169

外部变量在文件开头定义,则在整个文件范围内都可以使用该外部变量。书P170

(3)作用: 增加函数间数据联系的渠道.

同一个文件中的所有函数都能引用全局变量的值

书P170 例8。15

八、变量的存储类型

---—用来规定变量的作用域以及它们存在的长短

2.变量的存储类别

变量存在的长短:决定一个变量存在的范围(整个程序,部分函数)

从变量存在的时间(即生存期)角度来分,有静态存储变量和动态存储变量

静态存储方式:

指在程序运行期间分配固定的存储空间的方式

动态存储方式:

指在程序运行期间根据需要进行动态的分配存储空间的方式

供用户使用的存储空间:

程 序 区

三个部分 静态存储区

动态存储区

静态存储区:主要放全局变量

即:在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。

动态存储区:主要放

①函数形参变量。在调用函数时给形参变量分配存储空间.

②局部变量(未加static说明的局部变量)

③函数调用时的现场保护和返回地址

在函数套眼调用开始时分配动态存储空间,函数结束时释放这些空间。

(分配和释放是动态的)

C语言中,变量和函数有两个属性: 数据类型 (如整型、字符型等)

存储类型 (数据在内存中存储的方法)

C语言提供:(四种存贮类型符)

① auto(自动) ② register(寄存器)

③ staic(静态) ④ extern (外部)

C语言规定:存贮类型符放在变量定义的最前面

即:staic int a , b ;

(1)自动变量 ( auto )

定义在函数内部的变量,变量的建立与撤消是系统自动进行的.

在调用此函数时才给此变量分配存储单元,当函数执行完毕时,存储单元就被撤消。

定义方式有:在函数体开始处定义 、在复合语句中定义

36

(完整版)《C语言程序设计》教案(清华谭浩强)

注: 1)自动变量的存储类型符(auto)一般可省去。

2)自动变量是一个局部变量,其值在一个函数的两次调用之间不能保持。

(j4_11.c)

(2)静态变量(static)

在整个函数调用期间都可以保存其值的变量(在函数调用结束后,其值不消失而保留原值,即占用的存储单元不释放)

静态变量未初始化时,其值是零

自动变量未初始化时,其值是随机的

书P173 例8。17

注:静态变量的生存期是永久的,但它们的作用域却不都是全局的。

既:凡有static说明的,其作用域都是局限的;

a)局限于本函数内(静态局部变量)

b)局限于本文件内(静态外部变量)书P175 例8.18

示例: (j4_15.c)

如果把静态变量放在函数外面定义 称为静态外部变量,作用域为全局

静态外部变量的全局性仅限于本程序,它的值不能在文件之间互传

*(3)寄存器变量 ( register )

存放于CPU的一个寄存器中的变量(在CPU中进行)

可以把使用频率高的变量 定义为register,提高程序执行的速度.

寄存器变量只能用于整型和字符型。

变量的个数受CPU寄存器数目的限制。

示例:书P175 例8.19 (j4_12。c) 目前P系列 CPU自动分配

*(4)外部变量(extern )

外部变量主要用在:要在n个文件之间互访一批变量

外部变量的值是“永久”保留的;既从一个函数调用到另一个函数调用,它原来的值始终存在.

外部变量的作用域是整个程序(工程)。

1)作用域在n个文件之间的外部变量

一个程序中包含若干个文件,各个文件都要用到一些共用的变量时,就可以在一个文件中定义一批变量,而相关文件只要用extern说明它们是外部变量,那么,这些变量就可以供n个文件“全局”使用;同时,运算结果也可“共享"

(外部变量开辟一条文件之间传递数据的通道)P176 例8。20

2)作用域在一个程序中的外部变量

定义变量的语句应放在变量作用域的开始处,而在引用这些变量的函数中,可以不再使用变量说明。 示例: (j4_18.c)

总结:P180

作用域分析:

局部变量:自动变量(函数内):离开函数,值消失

定义 auto int a 函数内定义

静态局部变量(函数内):离开函数,值保留

定义 static int a函数内定义

寄存奇变量(函数内):离开函数,值消失

定义 register int a函数内定义

全局变量:静态外部变量(函数内,本文件) 首字母大写

使用static声明(可多次声明)

37

(完整版)《C语言程序设计》教案(清华谭浩强)

定义 ertern int A 函数外定义,用static声明(内外均可)

非静态外部变量(项目内所有文件)首字母大写 非动态,编译时分配内存

定义 ertern int A 函数外定义

变量存储时间

动态存储:自动变量(本函数内存在)

寄存奇变量(本函数内存在)

形式参数(本函数内存在)

静态存储:静态局部变量(函数外存在)

静态外部变量(函数外本文件内存在)

非静态外部变量(函数外,项目内所有文件存在)

变量存放位置

内存中静态存储区:静态局部变量(本函数)

静态外部变量(函数外部静态变量)

非静态外部变量(其它文件可使用)

内存中动态存储区:动态变量和形式参数

CPU中的寄存奇:寄存奇变量

* 3.内部函数和外部函数

内部函数:一个函数只能被本文件中其它函数所调用。(称静态函数)

在定义时:在函数名和函数类型前面加static

即:static 类型标识符 函数名(形参表)

外部函数:以extern说明的函数,表示此函数是外部函数。

书P182 例8。22

4. 项目文件(工程文件prj):多*.C源文件

九.编译预处理 书P187

编译预处理:——编译前对源程序进行的一些预加工。

C语言的预处理功能主要有三种:

a)宏定义 b)文件包含 c)条件编译

以“#"符号开头的行--为预处理的标志

1.宏定义(宏替换) 用预处理命令#define指定的预处理

1)不带参数的宏定义

用一个指定的标识符(即名字)来代表一个字符串

格式:#define 标识符 字符串

例: #define PI 3。14159

说明:a)用一个简单的名字代替一个长的字符串(PI 代替“3。14159” )

b)标识符(名字)称为“宏名”;

在预编译时将宏名替换成字符串的过程称为“宏展开”。

(在程序使用“宏名”过程中,需进行“宏展开" )

示例: #define PI 3。14159 #define R 4。0

main ( )

宏定义

#define PI 3。14159

{ float r , s ; #define S PI*R*R

printf( “ input radius:” ) ; main ( )

程序

scanf ( “%f” , &r ) ; {

s=PI * r * r printf (“S=%10。4fn" , printf ( “s=%10。4fn” , s ) ; }

38

S ) ;

(完整版)《C语言程序设计》教案(清华谭浩强)

}

运行结果:input radius 4 运行结果:S=50。2655

s=50。2655

c)宏名一般习惯用大写字母表示,与变量名相区别.(也可用小写字母)

宏定义不是C语句,不必在行末加分号.

d)#define 命令出现在程序中函数的外面;

宏名的有效范围为:定义宏命令之后到本源文件结束。

可以用#undef 命令终止宏定义的作用域(实现部分有效)

#define H 90

main ( )

{ 语句 H

}

# undef H

f1 ( )

{ 语句

2)带参数的宏定义

在字符串替换中,还要进行参数替换。

格式:#define 宏名(参数表) 字符串

例:#define S(a , b) a * b

area=S(4,5);

注意:区别它们的不同

#define PI 3。14159 #define PI 3。14159

#define S(r) PI * r * r #define S(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为CHINA

#define A 5.8 (数值) A为5.8

#define S(r) PI* r * r (表达式)

b)带参数的宏和函数是不同的。

函数调用时,先求出实参表达式,然后带入形参;

带参数的宏调用时,只是进行简单的字符替换。

函数中的实参和形参都要定义类型,而类型要求一致;

宏不存在类型问题,即宏名、它的参数无类型,只代表一个符号,展开时,带入指定的字符即可。

示例: ( J4_21。C)

2.文件包含

指一个源文件可以将另外一个源文件的全部内容包含进来

39

(完整版)《C语言程序设计》教案(清华谭浩强)

用#include命令实现“文件包含”预处理

格式: #include “文件名”

文件名:1)称为头部文件(header),常用字母“h”作为文件扩展名

(用“c” 作为文件扩展名也是可以的)

2)可以由用户自己编一个头部文件名,生成一个头部文件

3)使用标准库函数中的头部文件名

说明:

a)一个#include命令只能指定一个被包含文件

b)可以使用:#include “文件名” 或 #include 〈文件名>

#include “文件名” :可包含文件路径

#include <文件名〉 :只按指定的标准方式检索文件目录

(常用第一种,即:“文件名”,可包含文件路径)

c)文件包含可以嵌套

(1)用户定义的头部文件的使用

用户定义的头部文件(p_format.h)

#define PR printf

#define NL ”n”

#define D ”%d”

#define D1 D NL

#define D2 D D NL

#define D3 D D D NL

#define D4 D D D D NL

#define S "%s"

程序调用中包含用户定义的头部文件(j4_31。c)

#include ”p_format。h"

main()

{ int a,b,c,d;

char string[]="CHINA”;

a=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);

}

(2)标准库函数的头部文件的使用

C语言提供的400多个常用函数是以库的方式提供给用户。

400多个函数组成标准函数库,标准函数库一般进行分类,如:输入输出函数、数学函数、图形功能函数等。

每一类函数用一个头部文件来表示,用#include “函数库头部文件”就可以找到程序所需要的函数

如:#include “math。h” ——-—表示主程序同26个数学函数通信的连通,当主程序调用其中一个数学函数时,连接程序就把被调用的数学模块嵌入到程序中来。

40

(完整版)《C语言程序设计》教案(清华谭浩强)

书P381 附录 C库函数

* 3.条件编译

对满足一定条件的语句行进行编译——称条件编译

(一般情况下,源程序中所有的行都参加编译)

几种表示方法:

(1)

#ifdef 标识符

程序段1

#else

程序段2

#endif

作用:如果标识符被定义过(用#define定义),编译程序段1;

否则,编译程序段2

(2)

#ifndef 标识符

程序段1

#else

程序段2

#endif

作用:如果标识符未定义过(没有用#define定义),编译程序段1; 否则,编译程序段2

(3)

#if 表达式

程序段1

#else

程序段2

作用:如果表达式的值为真,编译程序段1;

否则,编译程序段2

十、该章的主要例题

P146 例8。2 P148 例8.3 P150 例8。4 P152 例8.5

P164 例8.10 P165 例8.11 P166 例8。13 例8.14 例8。15

P175 例8。18 P188 例9.1 P190 例9.3

十一、该章的主要习题:P186 8。1 8.3 8。4 8.5 8。11

十二、该章的主要上机内容

P146 例8。2 P164 例8.10 P165 例8。11

P166 例8。13 例8.14 例8。15 例8.16

P175 例8。18 P188 例9。1 P190 例9.3

其他:上机实验指导书中内容

例8.16

*8。15

41

(完整版)《C语言程序设计》教案(清华谭浩强)

第十章 指 针

重点:①指针的概念及C语言指针使用的特点。

②指针变量的定义、引用。

③数组的指针、字符串的指针、函数的指针、指向指针的指针的使用。

难点:①指针的运算和使用.

②指针在数组中的使用及使用特点。

指针:是C语言中最有特色的数据结构。

1)可以有效地表示复杂的数据结构;

2)能动态分配内存;即可以处理一批长度不确定的数据或一批动态变化的数据;

3)在调用函数时能得到多个值;

4)能直接处理内存地址。

一.指针的概念

整型 分配2个字节

定义的变量,一般在内存中分配存储空间 实型 分配4个字节

字符型 为1个字节等。

一个内存单元:

可用内存单元地址与内存单元内容表示

例: int i,j,k; 2000 3 变量i

2002 4 变量j

2004 12 变量k

3000 2000 指针变量p

内存

说明:1)变量的“直接访问”方式

在内存中已没有i,j,k变量名,对变量值的存取是通过地址进行的。

如:printf( “%d" , i ) 的执行:

根据变量名与地址的对应关系,找到变量i 的地址2000

然后从由2000开始的地址中取出数据,把它输出(值为3)

如:scanf( “%d” ,& i ) 的执行:

根据键盘输入的值,找到变量i 的地址2000

送到由2000开始的地址存储单元中。

如:k= i+j 的执行:

根据变量名与地址的对应关系

先找到变量i 的地址2000和j的地址2002

42

(完整版)《C语言程序设计》教案(清华谭浩强)

然后从由2000开始的地址中取出数据值(3)

从由2002开始的地址中取出数据值(4)把它相加后

和值(值为7)送到变量k的地址2006存储单元中。

这种按变量地址存取变量值的方式称为“直接访问"方式。

2)变量的“间接访问”方式

将变量i的地址存放在另一个内存单元中.

存取变量i的值:

先找到存放i的地址的单元(3000),从中取出i的地址(2000)

然后再到该地址中取出i的值( 3 )。

(P202 比方)

结论:

如果一个变量专门用来存放另一变量的地址 称“指针变量”

如:p为指针变量3000 2000是指针(地址)

p 3000 2000 2000 3

有: p 2000 *p=3 (&2000=3)

注:a)“*" 星号运算符(单目运算符)

功能是返回指针所指变量的数值

b)p 为指针变量,*p为指针变量所指的值

c)*运算符与&运算符的特点:

* -—指针运算符 & -—取地址运算符

优先级别相同,并且都是“右结合”

当p=&i时,可有:*p=3 或 *&i=3

二.指针的定义

1.格式:类型标识符 *变量名

类型标识符——表示该变量所指向的变量类型

例:int *p;

char *pc;

float *pf;

注:指针p , pc , pf 放的是地址值,为整型数;

而上面类型标识符,说明的是地址值所指向的数据类型。

即:*p=20 *pc= ‘s’ *pf=12.3

2.指针变量的引用

指针变量中: 只能存放地址(指针)

不能将一个整型量直接赋给指针变量。 p=2000

p 2000

使用有关的两个运算符: “*”、“&”

有: &a为变量a的地址,*p为指针变量p所指向的变量

例: main ( )

{ int a , b ;

int *p1 , *p2 ;

43

(完整版)《C语言程序设计》教案(清华谭浩强)

a=5 ; b=20 ;

p1=&a ;

p2=&b ;

printf( “%d,%dn”,a,b);

printf( “%d,%dn”,*p1,;

地址相同 p1*p2)地址与p2 p1=p2;

printf( “%d,%dn”,*p1,*p2);

*p1=2;

printf( “%d,%dn", a , b);

} p1

输出: 5 ,20 5

5 ,20

20,20 p2

5 ,2 20

说明: *与&的组合使用

&*p1:——有*p1为a , 那么,&*p1与&a相同

*&a :—-有&a为a的地址 , 那么,*&a与&p1相同

3.指针变量的运算

1)算术运算

只有:加、减

每加(减)一,就指向它基本类型的下一个(上一个)元素的位置。

例1:int a,b,c,d,*p1;

变量 内容 指针地址

p1=&b; a 1998

p1++; b 2000

有:p指向c变量,即p1=&c c 2002

如果p++改为p— — d 2004

有:p1=&a , p1指向a变量

例2:int a,b,c,d,*p1; x 3000

p1=&a; y 3004

p1=p1+2 z 3008

有:p指向c变量,即p1=&c

p1 2000 5000

例3:float x,y,z,*p2; p2 3000 6000

p2=&x;

p2=p2+2;

有:p指向z变量,即p2=&z

2)逻辑运算

C语言允许指针变量进行逻辑运算

例 (j6_11.c)

main ()

44

(完整版)《C语言程序设计》教案(清华谭浩强)

{ int *p,*q,*r,x;

int a=1,b=2,c=3;

printf(”n%x,%x,%xtn”,p,q,r);

p=&a;q=&b;r=&c;

printf("%x,%x,%x,%xtn”,p,q,r,p&&q&&r);

printf(”%xt”,(!p)?q:r);

输出:

d6 , 55f , 57e

ffd8 , ffda , ffdc , 1

ffdc

( P206 例10。2 P207 例10。3)

三.指针与数组 P210

一个变量可以有一个地址相对应,而一个数组包含若干个元素。

每个数组元素都在内存中占用存储单元,同样有一个地址相对应。

指针变量可以指向变量,

所以也可以指向数组和数组元素

即把数组起始地址或某一元素的地址放到一个指针变量中。

数组的指针: 是指数组的起始地址(指第一个元素的地址);

数组元素的指针: 是指数组元素的地址。

说明:引用数组元素 1)用下标法(即a[2]对应相应的地址)

2)用指针法(通过指向数组元素的指针找到所需元素)

1.指向数组元素的指针变量的定义与赋值

与定义指针变量的方法基本相同

定义:

int a[5] ; /*定义5个数组元素*/

int *p ; /*定义一个整型的指针变量*/

指针变量的赋值:

p=&a[0];

或 p=a; /*数组名a代表数组的首地址*/

在定义指针变量时可以赋给初值:

即: int *p=&a[0] ; 或 int *p=a ;

2.通过指针引用数组元素

假如: int a[5] ; p 2000

a[0 int *p=a ; 2002

]

a[1 如果: *p=2 表示对a[0] 赋值为2 即a[0]=2 2004

]

如果:p=p+2 ; *p=2 表示对a[2] 赋值为2 即a[2]=2a

[2

45

(完整版)《C语言程序设计》教案(清华谭浩强)

说明:(1)如果p的初值为&a[0]

则:a)p+i和a+i就是a[i]的地址

b)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]

(2)指向数组的指针变量也可以带下标

如:p[i]与*(p+i)等价

所以,引用一个数组元素,可用:

下标法,即:a[i]形式

指针法,即:*( a+i )或*( p+i )

P212

例:用各种方法输出数组全部元素 P212 例10.5

设有一个数组a,输入、输出数组各元素的值有三种方法:

1)下标法 2)通过数组名计算数组元素地址

main ( ) main ( )

{ int a[10]; { int a[10];

int i; int 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; i<10; i++)

printf(“%d”, a[i] ); printf(“%d", *(a+i) }。 }

3)用指针变量指向数组元素

main ( )

{ int a[10];

int *p, i;

for (i=0; i<10; i++)

scarf(“%d",&a[i] );

printf(“n” );

for (p=a; p〈(a+10); p++)

printf(“%d”, *p );

}

不能用下列语句代替上面加红的语句:

for (p=a; p〈(a+10); a++) /*a是数组名,是数组首地址,值不变*/

printf(“%d", *a );

例:

main ()

int ary[3][3]={10,11,12,20,21,22,30,31,32};

/*设数组ary的起始地址为2000*/

int *p1,*p2;

p1=&ary[0][0];

46

;

(完整版)《C语言程序设计》教案(清华谭浩强)

p2=&ary[0][0];

printf(”%d, %dn",*p2, *(p1+0));

printf("%d, %dn", *(++p2), ary[2][2]);

printf(”%d, %dn", *(p2+1), *(p1+1)+1);

}

结果: 10 ,10

11 ,32

12 ,12

P214 例10。6

例:一个指针变量当前值的程序 (jt9_6.c)

main ()

{ int *p,i,a[5];

p=a;

for (i=0;i〈5;i++)

scanf("%d",p++);

printf(”n”);

/*p=a*/

for (i=0;i〈5;i++,p++)

printf(”%dt",*p);

}

结果:

输入:1 2 3 4 5

输出:指针指向第五个元素之后的数据

指针的几种运算:

如果p指向数组a(即p=a)

a)p++(p+=1) , p指向下一元素,即a[1]

b)*p++为:先得到指针变量p所指向的变量的值(即*p),然后再使p+1→p

等价于*(p++)

例 printf(“%d”,*p++) 先输出*p,然后使p值加1

c)*(p++)与*(++p)的区别:

*(p++):——先取*p值,然后使p加1;

*(++p):——先p加1,再取*p值

如p=&a[0]; *(p++)值为:a[0]的值,p指向a[1]

*(++p)值为:a[1]的值,p指向a[1]

d)(*p)++为:p所指向的元素值加1,即:(a[0])++,

元素值加1,不是指针值加1

P215

3.一维数组与二维数组使用指针

(1)一维数组(p=a)

a+i 是 a[i]的地址

p+i 和a+i都表示a[i]的地址;指向数组的第i号元素

*(p+i)和*(a+i)都表示a+i所指对象的内容;即*(p+i)=*(a+i)=a[i]

指向数组元素的指针,可以表示成数组的形式;方法:p[i]=*(p+i)

47

(完整版)《C语言程序设计》教案(清华谭浩强)

例: p=a+3

那么:p[2]=*(a+3+2)=a[5]

p[—2]=*(a+3-2)=a[1]

(2)二维数组(p=a) 书P224

地址:100。 a[0]

106. a[1]

112。 a[2]

118。 a[3]

a[0][0]

A[0][1]

A[0][2]

a[1]A[1][1]

A[1][2]

[0]

a[2][0]

A[2]A[2][2]

[1]

a[3]A[3]A[3][2]

[0]

[1]

P225 表10.1

int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}

a[0],a[1],a[2],a[3]可表示二维数组 a[4][3]每行的首地址;

即有: a[i]=&a[i][0]

a[i]+j代表第i行第j个元素的地址

即有: a[i]+j=&a[i][j]

例 (j6_8。c)

#define NL printf(”n”);

main ()

{ int i,j,*p,a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};

printf(”n%dt%dt%dt%dn”,a[0],a[1],a[2],a[3]);

for (p=a[0]+2,i=0;i<10;i++)

printf("%5d”,*p++);

NL;

for (i=0;i<4;i++)

{ printf(”%d”,*(a+i)); *(a+i) I行首地址

for (j=0,p=*(a+i)+j;j<3;j++) printf("%5d",*p++);

NL;

}

程序输出:

100 106 112 118 (每行的首地址)

3 4 5 6 7 8 9 10 11 12 (第3个数组元素以后的数据)

100 1 2 3

106 4 5 6

112 7 8 9

118 10 11 12

当操作的对象是行时,可把a+0, a+1, a+2, a+3作为行的首地址

(3)指向由m个元素组成的一维数组的指针(P229)

可用于处理二维数组

格式:类型标识符 (*指针名)[数组长度]

例: float (*f )[5] ;

即定义了一个指向一维浮点数的指针

48

(完整版)《C语言程序设计》教案(清华谭浩强)

如果f指针地址为:1000

当:f[0]+i,指针就指向其后的4×i个单元,即f[0]+2=1000+8=1008

P229 例 10.13

4.数组指针作函数参数

指针作函数参数时,实参与形参必须匹配

有:

实参 形参

数组名 数组名 P218 例10。7

P175 指针变量 数组名 P223 例10.10

数组名 指针变量 P219

指针变量 指针变量 P220 P222 例10.9

例 (j6_11。c) 例 (j6_12。c) 例 (j6_13.c)

四.指针与字符串

以空字符( ‘0’ )结尾的字符数组称为字符串.

1.在C语言中,实现一个字符串有:

(1)用字符数组

要定义字符数组

static char st[ ]= “ABCDE” ;

printf (“%sn” , st );

注:st是数组名,表示字符数组的首地址

st[3]表示数组中序号为3的元素(D)

即:*(st+3); st+3是指向“D”指针

(2)用字符指针

可以不定义字符数组,而定义一个字符指针;用字符指针指向字符串中的字符

char *st= “ABCDE” ;

printf( “%sn” , st ) ;

注:没有定义字符数组,C语言对字符串常量是按字符数组处理的,实际上在内存开辟了一个字符数组用来存放字符串常量;用st指针指向字符串首地址。

st=2000

st A B C D E

2000 2001 2002 2003 2004

不能有:char *st ; 等于 char *st;

*st= “ABCDE” st=”ABCDE” 加*表示指针值

2.字符指针与字符数组

1)通过字符数组名或字符指针变量可以输出一个字符串;但对一个数值型数组,是不能用数组名输出它的全部元素

2)使用指针直接处理字符串和使用数组处理字符串的区别:

可以随时向一个已定义的字符指针赋一个字符串的值,而字符数组只有在初始化时才能这样做。

即: char *p , s[ ];

49

(完整版)《C语言程序设计》教案(清华谭浩强)

本文发布于:2024-02-04 09:35:45,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170701054653121.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   变量   数组   C语言
留言与评论(共有 0 条评论)
   
验证码:
排行榜

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23