二级C语言教学讲义

上传人:仙*** 文档编号:60490894 上传时间:2022-03-08 格式:DOC 页数:37 大小:206.50KB
收藏 版权申诉 举报 下载
二级C语言教学讲义_第1页
第1页 / 共37页
二级C语言教学讲义_第2页
第2页 / 共37页
二级C语言教学讲义_第3页
第3页 / 共37页
资源描述:

《二级C语言教学讲义》由会员分享,可在线阅读,更多相关《二级C语言教学讲义(37页珍藏版)》请在装配图网上搜索。

1、二级C语言教学讲义 考试方式1.笔试:90分钟,满分100分,其中含公共基础知识部分的30分。2.上机:90分钟,满分100分3、上机操作包括:(1)填空。(2)改错。 (3)编程。第一章 C 语言概述一、计算机语言:1、高级语言: 远离硬件(如VB、C、JAVA等)2、低级语言: 贴近硬件(如:汇编语言等)二、程序设计:1、概念:对程序统筹的步聚。2、步聚: 1)、确定数据结构 2)、确定算法 3)、编码 4)、调试程序 5)、整理并写出文档资料三、相关的概念:1、机器语言:只能接受和处理由0和1的代码构成的二进制指令或数据。2、源程序:由高级语言编写的程序 (C语言是.C文件)3、目标程序

2、:由二进制代码表示的程序 (C语言是.OBJ文件)4、执行程序:由种库函数连接起来生成的程序 (C语言是.EXE文件)四、C语言程序的结构1、程序的构成: 1)、C程序由函数组成的。 2)、C程序必须有一个且只能有一个主函数,并且主函数在程序中的位置是任意的。C语规定必须用main作为主函数。 3)、C程序总是从主函数开始执行。2、C语言程序的格式: 1)、C程序中的每一条执行语句都必须用“;”结束,分号是C语句的一部分,不是语句之间的分隔符。 2)、C程序中的任意位置都可加入注释。注释内容必须放在符号“/*”和 “*/”之间。 “/*”和“*/”必须成对出现,“/”与“*”之间不能有空格。注

3、释可以用英文,也可以用中文。第二章 标识符、常量和变量 1、标识符: 1)、定义: 由字母、数字和下划线组成,且第一个字符不能以数字开始,如变量名,函数名,数组名等,必须遵守一定的规则。(C语言的标识符区分大小写。) 2)、分类: A、关键字:C语言预先规定的。(32个) B、预定义标识符:C语言中预先定义且具有特定含义的。(Scanf、include等) C、用户标识符:由用户根据需要定义的。(自定义标识符)说明:当用户标识符与关键字相同,程序在编译时将给出出错信息; 与预定义标识符相同,系统并不报错,只是失去原定含义,代之以用户确认的含义,这样有可能会引发一些运行时错误。2、常量: 1)、

4、定义:指在程序运行过程中,其值不能被改变的量。 2)、分类: 整型:十进制、八进制和十六进制 实型(浮点型):小数形式、指数形式 字符:以单引号引用的一个字符。 所有的字符常量按整型量来处理,相应的ASCII码。 转义字符常量: 反斜线 + 一个特定字符字符形式功能字符形式功能n回车换行反斜杠字符“”t横向跳若干格单引号字符v竖向跳格”双引号字符r回车符(本行开头)ddd三位八进制代表的ASCII字符f换页符(当前页跳下页头)xhh二位十六进制代表的ASCII字符b退格符(往回退)0空值,其ASCII码值为0 对字符量的运算: 大写字母 +32 小写字母 小写字母 - 32 大写字母 数字字符

5、 -0 数字 数字 +0 数字字符 字符量可进行关系运算!字符串常量:以双引号引用的一个或多个字符。 在C语言中,系统在每个字符串的最后自动加入一个字符0作为字符串的结束标志,要占一个存储空间。符号常量:以#define 定义的量3、变量: 1)、定义:指在程序运行过程中,其值可以改变的量。 2)、规定: 程序中所有变量都必须先定义后使用。 一般定义,放在函数体内的前部,也可以放在函数的外部或复合语句的开头。 3)、分类: 整型: 基本型: int (VC6.0中开辟2个字节) 长整型:long (4个字节) 短整型:short (2个字节) 无符号型:unsigned (2个字节) 实型:

6、单精度型: float (4个字节,提供7位有效字位) 双精度型: double (8个字节,提供1516位有效字位) 字符型: 没有一种类型定义字符串变量。(没有字符串型) char (字符变量的值是该字符的ASCII码值) 输入输出格式: %c 输入字符时,字符之间不能有间隔符或一个字符一回车形式。 调用 putchar(ch)和ch=getchar()函数。 说明: ch是字符变量或字符常量;getchar()中,输入的空格、回车符都将作为字符读入。4、表达式(1)、定义: 由对象与运算符构成的式子。(2)、分类: 1)、算术表达式:+、-、*、/、% 说明: %运算符,运算对象只能是整

7、型数据。其他运算符还可以是实型数据。 注意: 当两边运算对象类型一致,结果的类型与运算对象一致。 当两边运算对象类型不一致,则系统自动先进行类型转换,再进行运算,结果类型自然知晓。 一边是整型,另一边是实型,则转换为实型。 一边是长整型,另一边是短整型,则转换为长整型。 一边是有符号型,另一边是无符号型,则转换为无符号型。 所有实型数运算,均以Double型进行运算。 优先级:()、正号、负号、*、/、%、+、- 说明: 正号、负号的结合方式: 从右到左 强制类型转换: (类型名)(表达式) 2)、赋值表达式: 多次给变量赋值,最后一次才是赋得的值。 赋值运算符优先级逗号运算符,比任何其他运算

8、符都低,且从右至左结合。 赋值运算符的左侧只能是变量,不能是常量或表达式。 等号右边的表达式也可以是一个赋值表达式。 3)、复合赋值表达式: A、定义:在赋值运算符之前加上其他运算符构成。 B、优先级: 同赋值运算符 C、赋值运算中的类型转换: 赋值号右侧与左侧类型一致时,才能运算 不同时, 系统将右侧类型先转换。 4)、自加、自减运算符和逗号运算符: A、自加、自减: 运算对象是整型变量,或实型变量,不能是常量或表达式。 结合方向: 从右至左 不要在一个表达式中对同一个变量进行多次自加、自减等运算,这样的话,不同的编译系统对这样的表达式将做不同的解释,进行不同的处理,因些结果也各不同。 B、

9、逗号运算符和逗号表达式: 结合方向: 从左至右,最后一个表达式的值才是此逗号表达式的值。 在所有运算符中,逗号运算符的优先级最低。第三章 顺序结构依语句出现的顺序逐条执行的程序结构。1)、赋值语句: 在赋值表达式的尾部加“;”构成的。2)、数据的输入和输出: A、C语言本身并没有提供输入输出语句,可通过调用包含在stdio.h的头文件里的标准库函数中的“Printf”和“Scanf”函数。 B、Printf函数语句: printf(格式控制,实参输出项表); 格式控制: 非格式描述符的字符或转义字符 + % + 格式描述符 实参输出项: 常量、变量、表达式 格式描述字符: 格式描述字符说明c输

10、出一个字符d或 i输出带符号的十进制整型数o以无符号八进制整型数,且不带先导符0;若结果要加先导符,则为“%#o”格式x或 X以无符号十六进制整型数,且不带先导符0#;若要,同上u以无符号十进制整型f以带小数点的数学形式输出浮点数(f和lf)e或 E以指数形式输出浮点数,小数位数,隐含为6位。指数位为3位。g或 G由系统决定采用%f格式还是%e格式,以使输出宽度最小,输出实型数,要四舍五入s输出一个字符串,直到遇到“0”.若字符串长度超过指定的精度则自动突破,不动它。p输出变量的内存地址%输出一个% 长度修饰符: 在%和格式描述字符加长度修饰符 l:长整型 h:短整型 输出数据所占的宽度说明:

11、 (m.n) 用整数指定宽度:m m 变量的实际宽度,右对齐,左补空格,达到m长度。 m 变量的实际宽度,右对齐,左补空格,达到m长度。 m 变量的小数部分,小数位右则补0。 n 实际长度,则右对齐,左边补空格。 m 实际长度,失效,输出实际长度。只用 “.n”格式,若n 实际长度,将输出字符串的前n个字符。输出数据左对齐: 在%与宽度之间加一个“-”。输出数据总带+号或-号: 在%与宽度之间加一个“+”。C、printf函数注意事项: 格式自由,可以在两两之间,留有逗号、空格或回车。 格式控制与输出列表一一对应,类型必须匹配。 printf函数有返回值,返回值是本次调用输出字符的个数,包括回

12、车等控 尽量不要输出语句中改变输出变量的值,因为可能会造成输出结果的不确定性。如int k=8; printf(“%d,%d”,k,+k);结果是9,9,因为调用函数printf时,其参数是从右至左进行处理的,将先进行+k运算。 输出数据时的域宽可以改变。 若变量m,n,i和f都已正确定义并赋值,则语句printf(“%* d”,m,i): 将按m指定的域宽输出i的值,并不输出m的值。而语句printf(“*.* f”,m, n, f):将按照m和n指定的域宽输出浮点型变量f的值,并不输出m,n的值。D、Scanf函数语句: Scanf(格式控制,&输入列表); 格式控制:(格式转换说明)指定

13、输入时的数据转换格式。格式字符说明c输入一个字符d输入带符号的十进制整型数i输入整型数,整型数可以是带先导0的八进制数,也可是0x的十六进制数o以八进制格式输入整型数,可以带先导0,也可以不带x以十六进制格式输入整型数,可以带先导0x,也可以不带u以无符号十进制形式输入整型数f(lf)以带小数点的数学形式或指数形式输入浮点数e(le)同上s输入一个字符串,直到遇到“0”.若字符串长度超过指定的精度则自动突破 注意: 在scanf函数的格式字符前可以加入一个正整数,但不可以对实数指定小数位。 输入一个字符流,scanf从这个流中按照格式控制指定的格式解析出相应数据,送到指定地址的变量中。 当输入

14、的数据 输入项,多余的数据等待下一个输入操作语句继续从此输入流读取数据。 Scanf函数有返回值,其值就是本次Scanf调用的正确输入的数据项的个数。 输入数值数据: 输入的数据之间必须用空格,回车符,制表符隔开。 指定输入数据所占的宽度: 针对数据粘连在一起用。 跳过某个输入数据: %与格式字符之间加入“*”号,跳过对应的输入数据。 逗号作为通配符。3)、复合语句和空语句: A、复合语句: 语句块; B、空语句: 只有一个分号第四章 选择(分支)结构程序设计进行逻辑判断进入其中一组语句。1、关系运算和逻辑运算(1)、C语言的逻辑值: 逻辑值只有两个: 真(非0表示,具体用1表示)、假(0表示

15、)(2)、优先级: 关系运算 逻辑运算 赋值运算 逗号运算(3)、注意: x和y都是浮点数,x= = y,结果为0。(4)、逻辑运算符和逻辑表达式: 短路现象: &: 当表达式1为0了,则不用判断表达式2了,结果为0。 |: 当表达式1为1了,则不用判断表达式2了,结果为1。2、选择结构程序设计(1)、用if语句实现选择结构: 1)、if(条件表达式) 语句 2)、if(条件表达式) 语句1 else 语句2 说明:else是if语句的一部分,可以省略,但不能单独使用。 if后括号里表达式,可是逻辑表达式、关系表达式、算术表达式、赋值表达式等,也可是任意类型的数据(如:整型、实型、字符型、指针

16、型等)。 无论是否有else子句,if子句如果只有一条语句,则此语句后的分号不能省略。(2)、嵌套的if语句: 规定:else子句总是与前面最近的不带else的if相结合,与书写格式无关。(3)、条件表达式构成的选择结构: 1)、条件运算符: ? : 2)、条件表达式: 表达式1? 表达式2: 表达式3 3)、条件运算符的优先级: 赋值运算符。(4)、用switch语句实现多分支选择结构。 1)、格式: switch(整型表达式/ 字符型表达式) case 常量表达式1: 语句1; case 常量表达式2: 语句2; case 常量表达式n: 语句n; default: 语句n+1;2)、说明

17、:case语句标号中的“常量表达式”的类型必须与switch后括号的类型相同。3)、间断语句: break; (退出switch语句体)(5)、语句标号和goto语句: 1)、语句标号:在其后面加一个“:”。 标号可以是任意合法标识符,也可以与变量同名。 语句标号必须与goto语句同在一个函数内。 2)、goto语句: 无条件转向语句。 格式: goto 语句标号;第五章 循环(重复)结构程序设计1.for循环结构: (1)、格式: for(表达式1;表达式2;表达式3) 循环体 (2)、说明: 1)、省略3个表达式,出现死循环(无限循环): 2)、省略表达式1,但分号不可省略,在for语句前

18、应该有表达式1。 3)、省略表达式2,但分号不可省略,出现死循环。 4)、省略表达式3,但应把其放入循环体中,否则循环无法结束。 5)、表达式1与表达式3可以是一个简单表达式,也可以是一个逗号表达式,更可 以与循环无关的任意表达式。2.while和do-while循环结构(1)、while循环结构: 当循环 1)、格式: while(表达式) 循环体 2)、说明: while括号里的表达式不能为空。 3)、注意: whie语句的循环体可能一次都不执行,因为while后圆括号中的条件表达式可能一开始就为0。 当循环体需要无条件循环,条件表达式可以设为1(恒真),但在循环体内要有带条件的非正常出口

19、(break等)。 4)、应用: 用于事先并不知道循环次数的循环。(2)、do-while循环结构: 1)、格式: do 循环体 while(表达式); 2)、注意: while后面一定有分号“;”。 循环体,是一条语句,也可以是复合语句。(3)、两者的区别: while循环的控制出现在循环体之前,只有当while后面条件表达式的值为非0时,才可能执行循环体,因此循环体可能一次都不执行; do- while循环,总是先执行一次循环体,然后再求条件表达式的值,因此,无论条件表达式的值是0还是非0,循环体至少要被执行一次。3.continue语句和break语句(1)、break语句在循环体中终止

20、本层循环。(2)、continue语句结束当前循环体中余下尚未执行的语句,立刻进行下一次的循环条件判定。(仅结束本次循环)第六章 数组1、C语言中提供的一种最简单的构造类型: 数组2、一维数组:(1)、一维数组的定义: 类型名 数组名整型常量表达式 ; 说明: C语言规定每个数组的第1个元素的下标总为0。(2)、一维数组元素的引用: 数组名下标表达式 说明: 一个数组元素就是一个变量名,代表一个存储单元。 在C语言中,一个数组不能整体引用,且数组名是一个地址常量,它代表整个数组的首地址。 在引用数组元素时,数组元素中下标表达式的值必须是整数。(3)、一维数组的初始化: 在定义同时赋初值: in

21、t a8=0,1,2,3,4,5,6,7; 当所赋初值 所定义数组的元素个数时,在编译时将给出出错信息。(4)、通过赋初值定义数组的大小: 如: int a =0,1,2,3,4,5; (长度为6)3、二维数组: (1)、二维数组的定义: 类型名 数组名常量表达式1 常量表达式2 ; 说明: 常量表达式1看成是矩阵的行数;常量表达式2看成是矩阵的列数。 行下标和列下标的下限总为0。 在C语言中,可以把一个二维数组看成是一个一维数组;每个数组元素又是包含若干个元素的一维数组。 (2)、二维数组元素的引用: 数组名下标表达式1下标表达式2 (3)、二维数组的初始化: 所赋初值个数=所定义的数组的元

22、素个数。 int a43=1,2,3,4,5,6,7,8,9,10,11,12; 所赋初值个数与所定义的数组的元素个数不同。 行少补0。 列少补0。 没分方括号,不跳赋值,不够时补0。 (4)、通过赋初值定义二维数组的大小: 只可省略第1个方括号内的常量表达式。 第1维的大小计算: 当初值的个数能被第2维的常量表达式的值除尽时,所得商数就是。 当初值的个数不能被第2维的常量表达式的值除尽时,则: 第1维的大小= 所得商数+1。 4、字符串与字符数组: (1)、用一维字符数组存放字符串: 1)、C语言对字符串的约定: 在C语言中,字符串是借助于字符型一维数组来存放,并规定以字符0作为“字符串结束

23、标志”。 0是一个转义字符,称为“空值”,它的ASCII代码值为0。0作为标志占用存储空间,但不计入串的实际长度。 strlen函数计算串的长度时,不计0。 sizeof 计算串的长度时,计入0。 由于字符串以0结尾,所以若要定义一个含有10个字符的字符串,则需要一个11个元素的一维字符数组。 2)、C语言中表示字符串常量的约定: 在表示字符串常量时,不需要人为在其末尾添加0。C编译程序将自动完成这一工作,在末尾添加字符0。 3)、C语言中字符串常量给出的是地址值: 在C语言中,字符串常量被隐含处理成一个以0结尾的无名字符型一维数组。 4)、字符数组与字符串的区别: 字符数组中不一定存放字符串

24、,但字符串一定要存放在字符数组中。 字符数组的每个元素中可存放一个字符,但它并不限定最后一个字符应该是什么。 可以给字符数组内存放字符串,不能通过赋值语句将字符串常量或其它字符数组中的字符串直接赋值字符串变量。(2)、通过赋初值的方式给一维字符数组赋字符串: 1)、 用给一般数组赋初值的相同方式给一维字符数组赋初值: 如: char str10=s,t,r,i,n,g,!,0; 前提: 数组元素个数一定要多于字符个数。 2)、在赋初值时直接,赋字符串常量: char str =“string!”;(3)、在C程序执行过程中给一维字符数组赋字符串: 1)、不可以用赋值语句给字符数组整体赋一串字符

25、。 2)、给数组元素逐个赋字符值,最后人为加入串结束标志。(可用循环结构)(4)、字符串的输入和输出: 对于字符串,可利用%c格式说明或字符输入、输出函数逐个输入、输出字符,输入时在最后人为加入0从而构成字符串,输出时用0作为输出结束标志。 C语言还提供了进行整串输入和输出的格式说明符%s及字符串输入、输出函数。 1)、输入和输出字符串时的必要条件: 当对字符串进行输出时,输出项是字符串常量、字符数组名、指向字符串的字符指针变量。 当对字符串进行输入时,输入项是字符数组名、字符指针变量、数组元素的地址。 2)、用格式说明符%s进行整串输入和输出: 说明: 用%s格式符输入字符串时,空格和回车符

26、都作为输入数据的分隔符而不能被读入。 若输入字符串的长度超过字符数组所能容纳的字符个数时,系统并不报错。 当输入项是数组元素的地址时,输入的字符将从这一元素开始依次存放在该数组中。 当输入项是字符指针变量时,该指针变量必须已指向确定的有足够空间的连续存储单元。 当输出存储单元中的字符,直到遇到第一个0是结束标志,不在输出字符之列,输出结束后不自动换行。 3)、调用gets、puts函数在终端输入或输出一行字符串: gets(字符数组名/字符数组元素的地址/字符指针变量) puts(待输出字符串的起始地址)(5)、字符串数组: 1)、定义:数组中的每个元素又都是一个存放字符串的一维数组。 2)、

27、二维字符数组的第一个下标决定了字符串的个数,第二个下标决定了字符串的最大长度,所以把它看作一个字符串数组。 3)、字符串数组也可以在定义的同时赋初值: char aa35=“A”,“BB”,“CCC”; 或 char aa5=“A”,“BB”,“CCC”;(6)、用于字符串处理的函数:头文件 1)、字符串复制函数: strcpy(s1,s2) :把s2复制到s1里,s1要足够大。 2)、字符串连接函数: strcat(s1,s2) :把s2接到s1后,且原先s1后的0被覆盖。 3)、求字符串长度函数: strlen(s) :不包括串尾的结束标志0。 4)、字符串比较函数: strcmp(s1,

28、s2) : 若s1s2,返正数; 若s1=s2,返0;若s1s2,返负数。第七章 函数1、在C语言中规定:一个实用的语言源程序总是由许多函数组成,这些函数都是根据实际任务,由用户自己来编写。也可以调用C提供的库函数。一个C语言源程序在正常情况下总是从main函数开始,main函数结束。2、库函数: 1)、调用C语言标准库函数时要求的include命令行。 注意:include命令行不是C语句! 2)、标准库函数的调用: 函数名(参数表) 说明: 出现在表达式中。 作为独立的语句完成某种操作。3、函数的定义和返回值: (1)、函数定义的语法: 一般形式: 函数返回值的类型名 函数名(类型名 形参

29、1,类型名 形参2, ) 说明部分 语句部分 说明: C语言规定,不能在函数的内部定义函数。 若在函数的首部省略了函数返回值的类型名,则默认的为int型。 函数必须先定义,后调用 。 函数没有返回值,则定义为void类型。(2)、返回值:通过return语句返回 1)、格式: return(表达式); 2)、说明: 表达式的类型必须与函数首部所说明的类型一致。 若不一致,则以函数值的类型为准,由系统自动进行转换。 若return语句不含表达式,必须定义为void类型。 可以没有return语句,必须定义为void类型。4、函数的调用: (1)、两种调用方式: 1)、以表达式形式出现。 2)、独

30、立语句出现。 (2)、调用时的语法要求: 调用函数时,函数名必须与所调用的函数名完全一致。 实参个数必须与形参个数一致,类型与应一一对应匹配。 C语言规定,函数必须定义后先说明,再调用。(除函数的返回值类型为int 或char时外。) C程序中,函数可以直接或间接的自己调用自己,称为递归调用。5、函数的说明: (1)、函数说明的一般形式: 类型名 函数名(参数类型1,参数类型2,) (2)、函数说明的位置: 在所有函数外部、被调用之前说明函数。 可以放在调用函数内的说明部分,则只能在调用函数内部才能识别。6、调用函数和被调用函数之间的数据传递: (1)、值传递: 实参单向传递给形参 (2)、地

31、址传递: 7、传给main函数的参数: (1)、main函数通常可用两个参数: main( int argc,char * argv) 也可以写成: main( int argc, char *argv ) (2)、第二个参数: argv0将存放字符串的第一个命令的首地址,后面依次类推。 注明: 命令行中,各参数之间用空格符或TAB符隔开,空格不作为参数的内容。若为参数的内容,应该把字符串放在一对双引号内。 8、函数的递归调用: (1)、分类: 1)、简单递归: 直接调用自己 2)、间接递归: 间接调用自己 (2)、应用: 一个问题要采用递归方法来解决,必须符合以下三个条件: 可以把要解的问题

32、转化为一个新问题,而这个新的问题的解法仍与原来的解法相同,只是所处理的对象有规律地递增或递减。 可以应用这个转化过程使问题得到解决。 必定要有一个明确的结束递归的条件。 9、用户标识符的作用域: (1)、作用域: 指程序中的某一部分,在这一部分中,该标识符是有定义的,可以被C编译和连接程序所识别。 (2)、分类: 1)、按作用域分: A、局部变量:(内部变量)在函数内部或复合语句内部定义(包括形参)的变量。 B、全局变量:(外部变量)在函数外部定义的变量。 2)、按存储类别分: A、自动类: auto 、 register B、静态类: static 说明:局部变量既可自动类,也可静态类。 全

33、局变量只能是静态类。 四个与存储类别有关的说明符: auto (自动) register(寄存器) static (静态) extern (外部) 注明: 它们可以放在类型名的左边,也可放在类型名的右边。(3)、局部变量及其作用域和生存期: 1)、auto变量: (自动类别的局部变量) 放在所在函数或复合语句中,全部可执行语句之前,存在auto说明符或没有指定。 变量的值不可被保留。 未赋初值,则为“无定义”。 2)、register变量: (CPU寄存器中,利于运行速度) 说明: 它说明的变量建议编译程序将变量的值保留在CPU的寄存器,而不是像一般变量那样,占内存单元。 注意: 应用于,对那

34、些频繁引用的少量变量指定为register变量。且不可进行求地址运算。 3)、static说明的局部变量(静态局部变量): 静态局部变量在内存的静态存储区中占据着永久性的存储单元。 初值是在编译时赋予的,C编译程序自动给它赋初值0。(4)、全局变量及其作用域和生存期: 1)、【static】:一般不写,只限于本编译单位使用。 2)、extern: 在同一编译单位内用extern说明符扩展全局变量的作用域: 作用域: 从extern说明外起,延伸到该函数末尾。 注意: 全局变量的说明与全局变量的定义不同: 全局变量的定义只能出现一次,在定义全局变量时,不可使用extern说明符;而对全局变量的说

35、明,则可以多次出现在需要的地方,这时必须用extern进行说明。 在不同编译单位内用extern说明符扩展全局变量的作用域: 方法: 在其中一个文件中定义所有全局变量,而在其他用到这些全局变量的文件中用extern对这些变量进行说明,声明这些变量已在其他编译单位中定义,通知编译程序不必再为它们开辟存储单元。 3)、作用域: 从变量定义的位置开始,到整个源文件结束止。 4)、生存期: 整个程序的运行期间。 说明: 若全局变量和某个函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内,访问的是局部变量,与同名的全局变量不发生任何关系。10、函数的存储分类: (1)、用extern说明函

36、数:外部函数 1)、 定义一个函数时,若在函数返回值的类型前加上说明符extern,则称为“外部”函数。 extern说明可以省略,一般的函数都隐含说明为extern。 2)、可以被其他编译单位中的函数调用。当函数调用语句与被调用函数不在同一编译单位,且函数的返回值为非整型时,应该在调用语句所在函数的说明部分用extern对所调用的函数进行函数说明。 (2)、用static说明函数: 定义一个函数时,若在其加上说明符static,则为“静态”(内部)函数。 只限于本编译单位的其他函数调用它,而不允许其他编译单位中的函数对它进行调用。第八章 编译预处理1、编译预处理:(1)、定义:就是C语言编译

37、程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令行进行处理的过程。(2)、表现: 在C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行。 可以出现在程序的任何一行的开始部位,其作用一直持续到源文件的末尾。2、宏替换: (1)、不带参数的宏定义: 1)、格式: #define 宏名 替换文本 或 #define 宏名 2)、说明:宏名是用户标识符,不得与程序中的其他名字相同。一般习惯于用大写字母表示。 替换文本中可以包含已定义过的宏名: 当宏定义在一行中写不下,需要在下一行继续时,只需在最后一个字符后紧接着加一个反斜线“”。 替换文本不能替换双引号中与宏名相同的字符串。

38、替换文本并不替换用户标识符中的成分。 在C程序中,宏定义的定义位置一般写在程序的开头。(2)、带参数的宏定义: 1)、格式: #define 宏名(形参) 替换文本 2)、说明: 在调用带参数的宏名时,一对圆括号必不可少,圆括号中实参的个数应该与形参个数相同。 在宏替换中,对参数没有类型的要求。 宏替换是在编译前由预处理程序完成,因此不占行动的时间。 宏替换中,实参不能替换括在双引号中的形参。(3)、终止宏定义: #undef 宏名3、文件包含: (1)、定义: 包含某类宏定义的文件。 是指在一个文件中,去包含另一个文件的全部内容(可是宏定义,也可是其他内容)。 (2)、形式: 1)、#inc

39、lude : 系统直接标准方式到有关目录中去寻找。 2)、#include “文件名” :系统先在源程序所在目录找,若找不到,则去标准方式到有关目录中去找。 4、动态存储分配: (1)、ANSI C标准为动态分配系统包含在“stdlib.h”定义了4个函数:malloc、calloc、free和realloc。 (2)、malloc和free函数: 1)、malloc函数: 返回值: void * 函数调用形式: malloc(size:无符号整型); 注意: 分配size个字节的存储区,返回一个指向存储区首地址的基类型为void的地址。 若没有足够的内存单元供分配,函数返回空(NULL)。

40、在调用函数时,必须利用强制类型转换将其转成所需的类型。 2)、free函数: 形式: free(p); (函数没有返回值) 注明: 指针p必须指向由动态分配函数malloc或calloc分配的地址。 (3)、calloc函数: 1)、返回值: void * 2)、形式: calloc(n,size); 3)、注意: calloc函数用来给n个同一类型的数据项分配连续的存储空间,每个数据项的长度为size个字节。若分配成功,函数返回存储空间的首地址;否则返回空。 通过调用calloc函数所分配的存储单元,系统自动置初值0。 使用calloc函数动态开辟的存储单元相当于开辟了一个一维数组。函数的第

41、一个参数决定了一维数组的大小;第二个参数决定了数组元素的类型。函数的返回值就是数组的首地址。 使用calloc函数开辟的动态存储单元,同样可以用free函数释放。第九章 指针1、变量的地址和指针:(1)、C程序怎样存取变量的内容? 1)、内存地址: 每个字节都有一个编号,用二进制表示。(为了直观,用十进制表示。) 2)、变量地址:是用该变量所占存储单元的第一个字节的地址。(2)、取变量值的方式: 1)、直接存取: 直接按变量的地址存取变量值的方式。 2)、间接存取: 通过变量间接得到另一变量的地址,然后再存取这另一变量值的方式。2、指针变量: (1)、定义: 用来存放地址的变量。 (2)、指针

42、变量的定义和指针变量的基类型: 1)、定义指针变量的形式: 类型名 *指针变量名; 2)、例如: int *p,*q; *是一个说明符,说明该变量是指针变量。 int是类型名,说明p和q是两个指向int变量的指针。int则为指针变量p和q的基类型。 3)、指向指针的指针变量: int *p,*s,k=20; s=&k; p= &s; 说明: 指针变量p的基类型是基类型为int类型的指针类型。 *p代表存储单元s,*s代表存储单元k,那么*p代表存储单元k。 指针变量必须区分基类型,基类型不同的指针变量不能混合使用。(3)、给指针变量赋值: 1)、给指针变量赋地址值: A、如: int k=1,

43、*q,*p; q= &k ; B、说明: 单目运算符&用来求出运算对象的地址,且运算对象的类型与指针变量的基类型相同。 &只能应用于变量和数组元素,不可用于表达式、常量或被说明为register的变量。 2)、通过指针变量获得地址值: A、如: p=q; B、说明: 赋值号两边指针变量的基类型必须相同。 3)、通过标准函数获得地址值:调用库函数malloc和calloc在内存中开辟动态存储单元,并把所开辟的动态存储单元的地址赋给指针变量。(4)、给指针变量赋“空”值: 1)、如: p=NULL; 或 p=0; 或 p=0; 2)、说明:NULL是在stdio.h头文件中定义的预定义符,代码值为

44、0。此时p称为空指针。 3、对指针变量的操作: (1)、通过指针来引用一个存储单元: 1)、规定: C语言提供了一个称作“间接访问运算符”的单目运算符: * 2)、如: int *p,i=10,j; p= &i; j= *p; 3)、 *p=*p+1 : 表示值+1。 4)、注意: *p= *p+1 相当于 *p+=1 相当于 + *p 相当于 (*p)+ 都是值+1 *p+ 或 *(+p) 是指移动了一次指针后对应的值。 *与+属于同级运算符,按自右至左的结合方向!(2)、移动指针: 1)、意义: 只有当指针指向一串连续的存储单元时,指针的移动才有意义。 2)、运算:当指针指向一串连续的存储

45、单元时,可以对指针变量进行加上或减去一个整数的运算,也可以对指向同一串连续的存储单元的两个指针进行相减的运算。除此之外,不可以对指针进行任何其他的算术运算。 3)、移动: 增1表示指针向地址值大(高地址)的方向移动一个存储单元,减1表示向地址值小(低地址)的方向移动一个存储单元。4、指针比较: 通常两个或多个指针指向同一目标(如一串连续的存储单元)时比较才有意义。5、函数之间地址值的传递: (1)、形参为指针变量:实参须为相同类型的地址值或指针变量。 (2)、通过传送地址值在被调用函数中直接改变调用函数中的变量的值。(地址传递) (3)、函数返回地址值: 函数值的类型不仅是简单数据类型,还可以

46、是指针类型。6、一维数组和指针: (1)、一维数组和数组元素的地址: 1)、数组名是一个存放地址值的指针变量名,其中的地址值是数组第1个元素的地址,也就是数组所占一串连续存储单元的起始地址。不可重赋值,因此,数组名是一个地址常量。 2)、p= &a ,是非法的。 p=&a0 或 p=a,则是合法的。 (2)、通过数组的首地址引用数组元素: 1)、a是a数组元素的首地址,a+0的值就是&a0。 2)、那么数组元素: a0则可表示为 *(a+0)。(3)、用带下标的指针变量引用一维数组元素: int *p,a10,i; p=a; 于是, ai、*(a+i)、pi、*(p+i ) 表示。7、二维数组

47、和指针:(1)、二维数组和数组元素的地址: 1)、二维数组由若干个一维数组组成: int *p,a34; p=ai; 相当于 p= *(a+i) 相当于p一个个指过去,先行后列! 2)、二维数组名也是一个地址值常量: 二维数组名应理解为一个行指针。 3)、二维数组元素: ai j、 4)、建立一个指针数组引用二维数组元素: int *p3, a32; pi= ai; 说明: 每个元素都是一个指针变量。 pi j、*(pi+j)、*(*(p+i)+j)、(*(p+i) j 5)、建立一个行指针引用二维数组元素: int (*p)2,a32; p=a; 说明:包含两个元素的数组的一个指针变量。 p

48、i j、*(pi+j)、*(*(p+i)+j)、(*(p+i) j(2)、二维数组名和指针数组作为实参: 1)、二维数组名作实参: 形参必须是一个行指针变量。 2)、指针数组作实参: 形参应当是一个指向指针的指针。8、使指针指向一个字符串: (1)、通过赋初值的方式使指针指向一个字符串: char *p= “form one”; 说明: 只是p指向字符串的第1个字符。(2)、通过赋值运算使指针指向一个字符串: char *p; p= “form one”;(3)、用字符数组作为字符串和用指针指向的字符串之间的区别: char mark =“program”; 表示开辟空间放值。 char *p= “program”; 表示指向首字符地址9、通过实参向函数传递函数名或指向函数的指针变量: (1)、指向函数指针变量的定义: #include double fun(int a,int *p) main( ) double (*fp) (int,int *),y;int n; fp= fun; y= (*fp)(56,&n); (2)、函数名或指向函数的指针变量作为实参: 形参应当是类型相同的指针变量。第十章 结构体(即“结构”)与共同体(即“联合”)1、序: C语言有基本类型(整型

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!