《C语言基础培训》PPT课件.ppt

上传人:cl****1 文档编号:570005351 上传时间:2024-08-01 格式:PPT 页数:87 大小:984.05KB
返回 下载 相关 举报
《C语言基础培训》PPT课件.ppt_第1页
第1页 / 共87页
《C语言基础培训》PPT课件.ppt_第2页
第2页 / 共87页
《C语言基础培训》PPT课件.ppt_第3页
第3页 / 共87页
《C语言基础培训》PPT课件.ppt_第4页
第4页 / 共87页
《C语言基础培训》PPT课件.ppt_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《《C语言基础培训》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《C语言基础培训》PPT课件.ppt(87页珍藏版)》请在金锄头文库上搜索。

1、1 C语言培训 (第一讲)上海*通信技术有限公司 金刚() 2011-032C语言概述语言概述数据类型运算符和表达式C程序语句函数编译预处理Linux系统概述培训大纲3C语言概述 C语言是70年代初问世的。1978年由美国电话公司B.W.Kernighan和D.M.Ritchit合著了著名的”THE C PROGRAMMING LANGUAGE”一书。通常简称为,也有人称之为标准。 但是,在中并没有定义一个完整的标准C语言,后来由美国国家标准协会(American National Standards Institute)在此基础上制定了一个C语言标准,于1983年发表。称之为ANSI C.4

2、C语言概述 C语言是国际上广泛使用的,且很有发展前途的计算机高级语言,时下流行的C+语言和C#语言都是从C语言发展而来的。 C语言适合用来进行系统描述,即可用来编写系统软件,也可用来编写应用软件。 C语言是一种与UNIX密切相关的程序设计语言,它最初用于DECPDP-11计算机UNIX。 20世纪70年代以来,操作系统中的大部分内容和应用程序都是用C语言编写的。5C语言优点语言简洁、紧凑(32个关键字),使用方便、自由。auto break case char const continue defaultdo double else enum extern float forgoto if i

3、nt long register return shortsigned static sizeof struct switch typedef unionunsigned void volatile while6C语言优点运算符丰富,共有34种,C语言把括号、赋值、强制类型转换等都作为运算符处理。表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言上难以实现的运算。数据结构合理,具有现在语言的丰富数据结构,能用来实现各种复杂的数据结构(如链表、树、栈等)的运算。具有结构化的控制语句,是结构化的理想语言允许位操作和对硬件进行编程。生成目标代码质量高,程序执行效率高程序可移植性较好7简单的C

4、程序介绍vi test.c#include void main() printf (“Hello World!”);保存后退出在操作系统下使用gcc命令编译源程序,如下所示:gcc -o test test.c运行目标程序:./test输入结果如下所示:Hello World! main是主函数的函数名,表示这是一个主函数。每一个C源程序都必须有,且只能有一个主函数main。 include称为文件包含命令,扩展名为.h的文件称为头文件。8C语言概述数据类型数据类型运算符和表达式C程序语句函数编译预处理Linux系统概述培训大纲9数据类型 一个程序应包括数据的描述和动作的描述两方面的内容。著名

5、计算机科学家沃思曾提出一个公式:程序=数据结构+算法,可见数据结构在程序中的地位。 C语言为用户提供了丰富的数据结构,还允许用户自定义复杂的数据结构。C语言提供的数据结构是以数据类型的形式出现的,C的数据类型划分如下图所示:实型(浮点型)基本类型构造类型指针类型空类型枚举类型字符型整型数组类型结构体类型共用体类型10数据类型常量与变量 C语言中数据有常量与变量之分。 常量一般能从字面形式判别,也可用一个标识符代表,可用下面的形式声明: #define 常量名 常量值 例如: #define PI 3.14 /* 定义PI代表常量3.14 */ “/*” 和“*/”之间表示这行符号中为注释内容,

6、不会被编译。 变量可用下面的形式声明: 数据类型 变量名; 如: int i; char name; 在C语言中,习惯上用大写字母代表常量,用小写字母代表变量。对于变量,要求“先定义,后使用”。11数据类型2.整型数据1)整型常量 整型常量可分为:int、short int、long int和unsigned int、unsigned short、unsigned long等类型,他们表示的数的范围不同。2)整型变量整型变量可分为基本型、短整型、长整型3种,下面给出一个示例:main() int a,b,c; unsigned d; a=6;b=-7;u=78; c=a+b+u; printf

7、(“%dn”,c); /*printf为格式化输出函数 */ /* %d表示输出格式化为十进制的整数*/运行结果为:7712数据类型2.实型数据1)实型常量 实型常量有两种表示方式, 一种为十进制形式,如0.12、36.2; 另一种为指数形式,如123e3表示123000。要注意e字母之前必须要有数字,e字母后面必须为整数。2) 实型变量 实型变量分为单精度(float)和双精度(double)两种,如: float x; double y; 单精度实数在内存中占4个字节,而双精度实数在内存中占8个字节。13数据类型4. 字符型1) 字符常量 C语言字符常量是用单引号括起来的一个字符,如a、A

8、等,注意以上两个字符是不同的。 另外,C语言还允许以一个“”开头的特殊字符常量,具体规定如表所示:特殊字符常量表字符类型功能n换行t横向跳格v竖向跳格b退格r按Enter键f走纸换页看以下下来代码的输出结果:main() printf(“ ab ct dertgn”); printf(“htibjd”);14数据类型4. 字符型2) 字符变量 用来存放字符变量,且只能放一个字符,定义规则如下: char d ; /*表示d为字符型变量*/3) 字符数据在内存中的存储形式和使用方式 字符变量在对应的内存中存放的是该字符相应的ASCII码,例如字符a的ASCII码为97,b的ASCII代码为98,

9、而字符与整型变量还可以互相赋值。示例代码:main() char c1,c2; c1=97,c2=98; printf(“%c %c”,c1,c2); /*%c表示输出格式为字符类型*/输出结果是:a b4) 字符串常量 字符串常量与字符常量的区别在于前者是双引号括起来的字符序列,而后者是单引号括起来的单个字符。如在内存中a的长度是一个字符,而“a”则占有两个字符,后者包括 结束标志“0”15数据类型5.枚举型 所谓枚举,是指将变量的值一一列举出来,变量的值只限于列举出来的值。 可用如下定义形式: enum weekday sun,mon,tue,wed,thu,fri,sat; 它定义了一个

10、名为weekday的枚举类型,能取7个值 然后,我们可以用此类型来定义变量,如: enum weekday date; 则date被定义成枚举变量,它能取sun到sat这7个值之一,如: date=sun; 也可直接定义枚举变量,如: enum weekday sun,mon,tue,wed,thu,fri,sat date; /*效果与上相同*/ 在C编译中,对枚举元素按常量处理,且它们是有值的。在上面的定义中,sun的值为0,sat的值为6.16数据类型 代码示例: main() enum sun,mon,tue,wed,thu,fri,sat date; date=mon; printf

11、(“%d”,date); 输出结果是:1说明: 枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。 在编译中,对枚举元素按常量处理,故称枚举常量,它们不是变量,不能对它们赋值。 枚举元素作为常量,它们是有值的,c语言编译按定义时的顺序使它们的值为0,1,2, 枚举值可以用来做判断比较 一个整数不能直接赋给一个枚举变量。17数据类型5.布尔型 C语言将非零整数都认为是真,认为零是假。布尔型只有真、假两个值。在表达式中,布尔量也作为整数处理,整数也可出现在布尔表达式中。示例代码:main() int m=1,j=6; while(m) /*m不等于0,为真*/ j=j

12、+m; m=m-1; printf(“%d”,j);则输出结果是:718数据类型7.数组 数组是有序数据的集合,数组中每一元素都属于同一数据类型,用一个统一的数组名和下标来唯一的确定数组中的元素。 1)一维数组 一维数组的定义格式如下: 类型说明符 数组名常量表达式; 如: int a10; 数组名为a,且有10个元素,下标从0到9,即a0到a9 注意常量表达式不能是变量19数据类型7.数组 一维数组的引用:只能逐个引用数组元素而不能引用整个数组 数组名下标; 代码示例如下: main() int j,a10; for(j=0;j=0;j-) printf(“%d”,aj); 运行结果是: 9

13、87654321020数据类型7.数组 一维数组的初始化列举如下: static int a10=0,1,2,3,4,5,6,7,8,9; /*static是静态数据的意思*/ 则 a0=0 a1=1 a9=9 如果花括号中值的个数少于10,则后面的都为0 2)字符数组 字符数组是一类特殊的数组,数组的每一个元素存放一个字母。 下面是它的定义方式: char 数组名常量表达式; 如: static char c5=a,e,t,g,b; 3).二维数组元素的引用和初始化 数组类型 数组名常量表达式1常量表达式2=初始化数据;21数据类型8.指针 指针是C语言中的一个重要特色,可以说是C语言的精华

14、。 它的概念非常复杂,使用非常灵活,是C语言中最大的难点。 一个变量在内存中的地址就称为该变量的指针。我们通过地址就能找到所需的变量单元。 指针变量的定义用下面的形式: 类型标识符 *标识符; 例如: int *pointer_1; 定义了一个指针变量pointer_1,它指向整型变量。 如果还定义了一个整型变量i,则可用赋值语句使一个指针变量指向一个整型变量。如: pointer_1=&i; &i是变量i在内存中的地址 或写成: *pointer_1=i;22数据类型8.指针 1.&*pointer_1的含义是什么 &和 *两个运算符的优先级别相同,但按自右而左的方向结合,因此先进行*poi

15、nter_1的运算,它就是变量a,再进行&的运算。 2.*&a的含义是什么 3.(*pointer_1)+相当于a+ 注意+和*为同一优先级别,但结合方向为右结合。 4.关于数组/指针的的形参/实参传递 1).形参,实参都用数组名 void main() int a10; f(a,10); void f(int x,int n) 2) .实参用数组名,形参用指针变量,如: void main() int a10; f(a,10); f(int *a,int n) 23数据类型8.指针 二维数组是“数组的数组”,例如: 定义int a34=1,3,5,7,9.11.13,15,17,19,21,

16、23,则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为2000,则有: 24数据类型8.指针 指向多维数组的指针变量: 把二维数组a分解为一维数组a0,a1,a2之后,设p为指向二维数组的指针变量,可定义为:int (*p)4 它表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数据a0,其值等于a,a0,或&a00 而p+i则指向一维数组ai 从前面的分析可得出*(p+i)+j是二维数组i行j列的元素的地址,而*(*(p+i)+j)是i行j列元素的值 二维数组指针变量说明的一般形式为: 类型说明符 (*指针变量)长度 其中类型说明符为所指数组的数据类型。*表

17、示其后的变量是指针类型。长度表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。25数据类型8.指针 指针函数是返回指针的函数。 例如:int * getInt(char * str); 函数指针是指向函数地址的指针。 例如: int (*func)(char a,char b); 指针数组:一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为:类型名 数组名数组长度;例如:int *name4; char *name=“this”,”is”,”a”,”dog”; 指向指针的指针: 例如:char

18、*p; p的前面有两个*号。*运算符的结合性是从右到左,因此*p相当于*(*p),显然*p是指针变量的定义形式。如果没有最前面的*号,那就是定义了一个指向字符串数据的指针变量。现在它的前面又有了一个*,表示指针变量p是指向一个字符指针变量的。 *p就是p所指向的另一个指针变量26数据类型 一、指针变量加减一个整数 如:p+,p-,p+i,p-i,二、指针变量赋值 将一个变量地址赋给一个指针变量,如: p=&a; /将变量a的地址赋给p p=array; /将数组array的首元素地址赋给p p=&arrayi;/将数组array的第i个元素的地址赋给p p=max; /max为已定义的函数,将

19、max的入口地址赋给p p1=p2; /p1和p2都是指针变量,将p2的值赋给p127数据类型三、指针变量可以为空值,即该指针变量不指向任何变量,可以这样表示:p=NULL;四、两个指针变量可以相减 如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数。28数据类型五、两个指针变量比较 若两个指针指向同一个数组的元素,则可以进行比较。指向前面的元素的指针变量“小于”指向后面元素的指针变量 关于void类型: void真正发挥作用在于: 1.对函数返回的限定 2.对函数参数的限定 例如:void abc(void); void指针和const指针: ANSI新标

20、准增加了一种“void”指针类型,即不指定它是指向哪一种类型数据的指针变量。例如:void * p; 表示指针变量p不指向一个确定的类型数据,它的作用仅仅是用来存放一个地址。 void指针它可以指向任何类型数据。也就是说,可以用任何类型的指针直接给void指针赋值。但是,如果需要将指针的值赋给其它类型的指针,则需要进行强制类型转换。29数据类型void main(void) const char *str=“hello world”; /在指针定义语句的类型前加const,表示指向的对象是常量 /声名一个名为str的指针变量 /它指向一个字符型常量,初始化str为指向字符串/hello wor

21、ld str0=w; /这条语句是错误的,但可以改变str指针的值 printf(“nn%s”,str); str=“hello ,china”; printf(“nn%s”,str);void main(void) char * const str=“hello world”;/在指针定义语句的指针名前加const,表示指针本身是常量 /常量指针是一个固定的指针,不可以改变它的值,但它所指的数据可以改变 printf(“nn%s”,str); str0=w; /合法 str=“hello ,china”;/非法 printf(“nn%s”,str);const char * const st

22、r=“hello world”;30数据类型9.结构体 结构体是C语言提供的一种数据结构,相当于其他高级语言中的“记录”。 下面是定义一个结构体类型的一般形式: struct 结构体名 成员列表 变量名列表; 对个成员都进行类型说明,如: 类型标识符 成员名 31数据类型9.结构体 下面是一个具体示例: struct student int num; char name20; char sex; int age; float score; char addr(30); student1=“33”,”zhanwei”,”m”,”22”,”75”,”32#307”); 定义了一个struct st

23、udent类型的变量student1,它包括num,name,sex,age,score,addr不同类型的数据项,各项初值分别为33、zhanwei、m、22、75、32#30732数据类型10.共用体 几个不同的变量共占同一段内存的结构,称为“共用体” 共用体类型变量的定义形式如下: union 共用体名 成员列表 变量列表; 如: union data int j; char ch; float f; a,b,c; 上面定义了一个union data类型,再将a,b,c定义为union data类型 共用体的引用方式如下: a.j 上语句引用共用体变量a中的整型变量j33C语言概述数据类

24、型运算符和表达式运算符和表达式C程序语句函数编译预处理Linux系统概述培训大纲34运算符和表达式1.运算符 C语言提供了十分丰富的运算符,主要有如下几种: 算术运算符:+、-、*、/、+等 关系运算符:、等 赋值运算符:等号(=)及其扩展赋值运算符(+=、-=、*=、/=等) 指针运算符:*、&2.表达式 用各种运算符将运算对象连接起来的式子,就称为表达式。35运算符和表达式1)算术表达式 用算术运算符和括号将运算对象连接起来的式子,称为算术表达式。包括强制类型转换,可将一个表达式转换成所需类型。如将x+y的值转换成整型: (int)(x+y); 这里请注意两个特殊的算术运算符:+和-,分别

25、为“自增”和“自减”运算符。 i+ 先使用自身的i值,再自身加i +i; 先加i,再使用新的i变量。2)赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。一般形式为: 如: a=87;36各类数值型数据之间的混合运算 变量的数据类型是可以转换的,转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同数据类型的混合运算时,由编译系统自动完成。 自动换换遵循以下规则: 1)若参与运算变量的类型不同,则先转换成同一类型,然后进行计算 2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long运算时,先把int量转换成long型再进行计算。 3

26、)所有的浮点运算都是以双精度运行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。 4)char型和short型参与运算时,必须先转换成int类型。 5)在赋值运算中,赋值号两边变量的数据类型不同时,赋值号右边的类型将转换为左边的类型。如果右边量的数据类型长度比左边长时,将丢失一部份数据,这样会降低精度,丢失的部分按四舍五入向前舍入。 下图表示了类型自动转换的规则:37强制类型转换 强制类型转换时通过类型转换运算来实现的。 其一般形式为:(类型说明符)(表达式) 其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。 例如: (float) a /把a转换

27、成实型 (int) (x+y) /把x+y的结果转换成整型38逗号运算符和逗号表达式 在C语言中逗号”,”,也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式。 其一般形式为:表达式1,表达式2, 其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。 对于逗号表达式要说明: 逗号表达式一般形式中的表达式1和表达式2页可以又是逗号表达式 例如:表达式1,(表达式2,表达式3),形成嵌套表达式 因此可以把逗号表达式扩展为以下形式:表达式1,表达式2,表达式n 整个逗号表达式的值等于表达式n的值39C语言概述数据类型运算符和表达式C程序语句程序语句函数编

28、译预处理Linux系统概述培训大纲40C程序语句 C语言的语句用来向计算机系统发出操作指令。一个语句经编译后产生若干条机器指令。C语言程序的结构如下图所示:C语言源程序文件1源程序文件2 源程序文件n预编译指令函数1函数n说明部分执行部分语句41C程序语句C程序语句主要可以分为如下三类:1.控制语句 完成一般的控制功能,主要有如下几种: 1)条件语句(if) 根据判断所给条件是否满足来决定执行何种操作,有三种形式的if语句 .if (表达式) 语句; 如果表达式成立,执行语句 . if (表达式) 语句1; else 语句2 如果表达式成立,执行语句1,否则执行语句2 . if (表达式1)

29、语句1; elseif (表达式2) 语句2; elseif (表达式n) 语句n; else 语句m;42C程序语句代码示例如下:/*判断所输入的年份是否为闰年*/main() int year,leap; scanf(“%df”,&year); if (year&4=0) if(year%100=0) if (year%400=0) leap=1; else leap=0; else leap=1; else leap=0; if (leap) printf(“%d is a leap year.”,year); else printf(“%d is not a leap year.”,y

30、ear);如果输入:2000计算机将输出:2000 is a leap year43C程序语句2.循环语句 while循环语句 while(表达式) 语句; 当表达式为真时,执行语句命令。如果循环体包含一个以上的语句时,应该用大括号“”括起来。 do-while语句 do 语句; while(表达式); 与while语句表达式不同的是:while语句是先判断,后执行;而此语句是先执行语句,后判断表达式。44C程序语句2.循环语句 for循环语句 for(循环变量初值;循环条件;循环变量增值) 语句; 如循环体语句包含一个以上的语句,应用花括号括起来。 下面的程序实现输出100-200间的偶数

31、代码如下所示: main() int n; for(n=100;n=80) grade=1; else if(score=60) grade=2; else grade=3; switch(grade) case 1:printf(“You are a perfect student!”); case 2:printf(“Do not play so more!”); case 3:printf(“You must study harder!”); 如果你输入你的成绩:76计算机会算出:Do not play so more!47C程序语句 break和continue语句 break语句可以

32、用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的, 其语法形式为: break; break语句不能用于循环语句和switch语句之外的任何其他语句中。 注意: 1)break语句对if-else的条件语句不起作用。 2)在多层循环中,一个break语句只向外跳一层。 continue语句 作用为结束本次循环,即跳过循环体中下面尚未结束的语句,接着进行下一次是否执行循环的判定。 一般形式为: continue; 48C程序语句2.函数调用语句 函数调用语句是由一个函数调用加一个分号构成的语句。 1).基本输入语句 字符输入语句(getchar) 作用是从终端或运输设备中输入一个字符

33、,此函数没有参数 变量名=getchar(); 格式输入语句(scanf) 用scanf函数可以输入任何类型的多个数据。 scanf(格式控制,地址列表); 格式控制是用双引号括起来的字符串,也称为转换控制字符串,主要用到的格式字符如下。 %d用来输入十进制整数 %ld用来输入长整型数据 %hd用来输入短整型数据 %c用来输入单个字符 %s用来输入字符串 %f用来输入实数 %lf用来输入double型实数49C程序语句2.函数调用语句示例代码如下:main(0 int a,b; scanf(“%d %d”,&a,&b); /*是地址运算符,&a表示a的地址*/ printf(“%d,%dn”,

34、a,b);运行按如下方式输入a和b的值:3 4 (输入a,b的值)3,4 (输出a,b的值)50C程序语句2)基本输出语句 字符输出函数putchar 作用是向终端输出一个字符。如: putchar( c ); 输出字符变量c的值 格式化输出函数printf 作用是向终端输出若干个任意类型的数据 printf(格式控制,输出列表); 格式控制与前面输入语句的规定几乎一样,但要增加以下几项: %u用来输出unsigned %m.nf用来指定输出的实数数据共占m列,其中有n位小数 %m.ne用来输出指数形式的实数,m为所占的列数,n指小数位数。51C程序语句 下面的程序将实现华氏温度到摄氏温度的转

35、换,c表示摄氏温度,f表示华氏温度,输出小数点后两位,示例代码如下: #include /*include 属于编译预处理中的“文件包含”语句*/ main() float c,f; scanf(“%f”,&f); c=5*(f-32)/9; printf(“%.2f”,c); 如果输入: 64 最后输出为: 17.783)表达式语句 最典型的是由赋值表达式构成的赋值语句,如: a=32; 它与赋值表达式的区别是最后的分号,一个语句最后必须以分号结尾。C语言的大多数语句都是表达式语句。52C语言概述数据类型运算符和表达式C程序语句函数函数编译预处理Linux系统概述培训大纲53函数概述: 一个

36、较大的程序可分为若干个程序模块,每一个模块用来实现一个特定的功能。 在高级语言中用子程序实现模块的功能。子程序由函数来完成。一个C程序可由一个主函数和若干个其他函数构成。 函数的调用关系: 由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任何多次。54函数 函数调用说明: 1)一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。 对较大的程序,一般不希望把所有内容全放在一个文件中,而是将他们分别放在若干个源文件中,再由若干源程序文件组成一个C程序。这样便于分别编写、分别编译,提高调试效率。一个源程序文件可以为多个C程序公用。 2)一个源程序文件

37、由一个或多个函数组成。 一个源程序文件是一个编译单位,在程序编译时时以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。 3)所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套定义。 函数间可以互相调用,但不能调用main函数,因为main函数是系统调用的。55函数 函数调用说明: 4)从用户使用的角度看,函数有两种: 标准函数,即库函数。这是由系统提供的,用户不必自己定义这些函数,可以直接使用它们。应该说明,不同的C系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。 用户自己定义的函数,用以解决用户的专门需要。

38、 6)从函数的形式看,函数分两类: 无参函数。 有参函数。56函数 一个较大程序一般应分为若干个程序模块,在高级语言中用子程序来实现模块的功能。函数用如下方式定义: 类型标识符 函数名(形式参数列表) 形式参数说明 说明部分 语句 下例是一个求解两数之和的函数: int add(x,y) int x,y; int z; z=x+y; return (z); /*返回值为z*/ 57函数 可以在程序中调用已经定义了的函数,调用方式如下: 函数名(实参列表); 如对上面定义的函数,有下面的程序段: main() int add(); /*声明函数原型*/ int a,b,c; scanf(“%d,

39、%d”,&a,&b); c=add(a,b); /*进行函数调用*/ printf(“the sum of a and b is %d”,c); 如果输入: 54,32 则得到如下输出: The sum of a and b is 8658函数 有关形参与实参的一些重要说明: 1)在定义函数中指定的形参时,它们并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。 2)实参可以是常量、变量或表达式,如: max(3,a+b); 但要求它们有确定的值。在调用时将实参的值赋给形参。 3)在被定义的函数中,必须指定形参的类型。 4

40、)实参与形参的类型应相同或赋值兼容。如果实参为整型而形参为实型,或者相反。 例如实参值a为3.5,而形参x为整型,则将实数3.5转换成整数3,然后送到形参b.字符型与整型可以互相通用。59函数 5)在C语言中,实参向对形参的数据传递时“值传递”(相当于COPY),单项传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元式是不同的单元。 在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值。60函数 关于函数的返回值的一些说明:

41、 1)函数的返回值是通过函数中的return语句获得的: return语句将被调用函数中的一个确定值带回主调函数中去 如果需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包含return语句。 如果不需要从被调用函数带回函数值可以不要return语句。 一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用,return语句后面的括弧也可以不要,如return z;等价于return (z); return后边的值可以是一个表达式。 2)函数的返回值应当属于某一个确定的类型,在定义函数时指定函数返回值的类型。 特别提示: 在C语言中,凡不加类型

42、说明的函数,自动按整型处理。 3)对于不带返回值得函数,应当用”void”定义函数为”无类型”(或称空类型”) 这样,系统就保证不使函数返回任何值,即禁止在调用函数中使用被调用函数返回值。 此时在函数体中不得出现return语句。61函数 对被调用函数的声明和函数原型: 在一个函数中调用另一个函数(即被调用函数)需要具备哪些条件呢? 1)首先被调用的函数必须是已经存在的函数(是库函数或用户自定义函数)。 2)如果使用库函数,还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。 3)如果使用用户自定义的函数,而该函数的位置在调用它的函数(即主调函数)的后

43、面(在同一个文件中),应该在主调函数中为被调函数作声明。 关键词区别以下: 声明一词的原文是declaration,过去在许多书中把它译为说明。声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数时,编译系统能正确识别函数并检查调用是否合法。(例如函数名是否正确,实参与形参的类型和个数是否一致)。 函数的定义和声明不是一回事。函数定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位(占内存)62函数 函数的嵌套调用 嵌套定义就是在定义一个函数时,其函数体内又包含一个函数的完整定义。 然而,C语言不能嵌套定义函数

44、,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。main() a();a() b();b() return 0;63函数 局部变量和全局变量 局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为局部变量。 说明: 1)形式参数是局部变量。 2)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效。这种复合语句也称为分程序或程序块。示例:void main() int a,b; int c; c=a+b; /c在此范围内有效,a,b在此范围内也有效 64函数全

45、局变量: 在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称为全程变量) 全局变量可以为本文件中的函数所共用。它的有效范围为从定义变量的位置开始到本文件结束。65函数全局变量: 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。 使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。 它使函数的通用性降低了,因为函数在执行时依赖于其所在的外部变量。如果一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若

46、该外部变量与其他文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。 一般要求把C程序中的函数作成一个封闭体,除了可以通过“实参-形参”的渠道与外界发生联系外,没有其他渠道。66函数变量的存储类别: 动态存储方式与静态存储方式: 前面介绍了从变量的作用域(即从空间)角度平分,可以分为全局变量和局部变量。 从变量值存在时间(即生存期)角度来分,又可以分为静态存储方式和动态存储方式。 静态存储方式是指在程序运行期间在静态存储区分配存储空间的方式。 动态存储方式则是在程序运行期间根据需要在动态存储区分配存储空间的方式。 用户存储空间可以分为三部分: 1.程序区 2.静态存储区 3.动态存储区

47、 在C语言中每一个变量和函数有两个属性:数据类型和数据的存储类别。 对数据类型(如整型、字符型等)。存储类别指的是数据在内存中存储的方式。 存储方式分为两类:静态存储和动态存储 具体包含四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern) 根据变量的存储类别,可以知道变量的作用域和生存期67函数auto变量 函数中的局部变量,如不专门声明为static存储类别,都是动态的分配存储空间的(栈),数据存储在动态存储区中。 函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束

48、时就自动释放这些存储空间。 因此这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。int f(int a) auto int b,c=3; 关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。68函数用static声明局部变量: 有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。 这时就应该指定该局部变量为静态局部变量,用关键字static进行声明。 对静态局部变量的说明: 1.静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整

49、个运行期间都不释放。 2.对静态局部变量是在编译时赋初值的,即只赋值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值,而只是保留上次函数调用结束时的值。69函数 3.如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符串(对字符变量) 4. 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。70函数register变量: 一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存的。 当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算,如果需要存数,再从运算器将数据

50、送到内存存放。71函数register变量: 如果一些变量使用频繁(例如在一个函数中执行1000次循环,每次循环中都要引用某局部变量),则为存储变量的值要花费不少时间。 为提高执行效率,C语言允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。 由于对寄存器的存储速度远高于对内存的存取速度,因此这样做可以提高执行效率。 这种变量叫做寄存器变量,用关键字register作声明。 用extern声明外部变量: 外部变量即全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。 在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配

51、在静态存储区。 有时需要用extern来声明外部变量,以扩展外部变量的作用域72C语言概述数据类型运算符和表达式C程序语句函数编译预处理编译预处理Linux系统概述培训大纲73编译预处理 通常在C编译系统对程序进行编译前,先对程序中一些特殊的命令进行“ 预处理”,然后将预处理的结果和源程序一起进行编译处理,得到目标代码。 1.宏定义 1)不带参数的宏定义 用一个指定的标识(即名字)来代表一个字符串,它的一般形式如下: #define 标识符 字符串 如: #define PI 3.1415926 这里需要注意的有以下几点: 宏定义不是C语句,结尾不必加分号。若加上分号则连分号也一起被置换。 通

52、常#include 命令写在文件开头,位于函数之前,作为文件的一部分,在此文件范围内起作用,其作用域为宏定义命令起到源程序结束。 如果要终止其作用域可使用#undef命令。 对程序中用双引号括起来的字符,即使与宏名相同,也不作替换 进行宏定义时,可以引用已定义的宏名,可以层层替换。 在编写源程序时,所有的3.1415926都可由PI代替,而对源程序做编译时,将先由预处理程序进行宏代换,即用3.1415926表达式去置换所有的宏名PI,然后再进行编译。74编译预处理 2)带参数的宏定义 除了进行简单的字符串替换外,还要进行参数替换,它的一般形式如下: #define 宏名(参数表) 字符串 带参

53、数的宏与函数非常类似,在引用函数时也是在函数名后的括号内写实参,且要求实参的数目等于形参的数目,但它们还是有区别的: 对参数的使用方式不一样。函数调用时,先求出实参表达式的值,然后带入形参;宏只进行简单的字符替换。 处理机制不一样。函数调用在程序运行时处理,且要分配内存;宏展开在编译时进行,不分配内存单元,不发生值的传递处理,也不存在返回值 定义时的要求不一样。函数定义时,实参和形参都要定义类型;宏定义时不存在类型问题。 在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。75编译预处理2)带参数的宏定义 示例代码如下: /

54、*输入一个圆的半径,求出它的面积*/ #include “stdio.h” #define PI 3.1415926 #define area PI*r*r main() float r,a; scanf(“%f”,&r); a=area( r ); printf(“The area is %f”,a); 注意:1.带参宏定义中,宏名和形参表之间不能有空格出现。2.在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。76编译预处理2.文件包含语句 在文件包含语句中,一个源文件可以将另外一个源文件的全部内容包含起来,其一般形式如下: #include “文件名” 如: #include

55、此时被包含的文件stdio.h与其所在的文件在预编译之后组成同一个文件。对被包含文件的修改将影响到其所在的文件。说明:1.一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令2.文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。3.包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。77编译预处理2.文件包含语句例如:以下写法都是允许的:#include “stdio.h”#include 但是这两种形式是有区别的: 使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找。 使用双引号则表

56、示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己的文件所在的目录来选择某一种命令形式。78编译预处理3.条件编译 预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。 条件编译有三种潜规则,下面分别介绍: 第一种:形式:#ifdef 标识符 程序段1#else 程序段2#endif它的功能是,如果标识符已被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。或者:#ifdef 标识符 程序段1#endif 79编译预处理3.条件编译第二种:形式:#ifndef 标

57、识符 程序段1#else 程序段2#endif80C语言概述数据类型运算符和表达式C程序语句函数编译预处理Linux系统概述系统概述培训大纲81Linux系统概述 Linux系统的基本知识和一些重要特性: Linux系统是从UNIX发展来的。 UNIX是世界上最流行的操作系统之一,它是一种实时操作系统,是可以运行于大型和小型计算机上的多任务系统。但由于它比较庞大,而且价格昂贵,所以不适合PC机用户使用。而Linux正好弥补了这些缺点,同时还继承了UNIX的大多数优点。 由于它是基于PC机上运行的操作系统,并且内核源代码是公开的,使得Linux成为时下比较流行的操作系统之一。82Linux系统的

58、发展历史 Linux是一种适用基于PC机的计算机操作系统,它适合于多种平台,是目前唯一免费的非商品化操作系统。 Linux诞生于1991年底,是一个芬兰大学生开发出来的。由于具有结构清晰、功能强大等特点,它很快成为许多院校学生和科研机构的研究人员学习和研究的对象。 在他们的热心努力下,Linux逐渐成为一个稳定可靠、功能完善的操作系统。而一些软件公司也不失时机的推出以Linux为核心的操作系统,大大推动了Linux的商品化,使Linux的使用日益广泛,成为当今最流行的操作系统。83Linux系统的发展历史 Linux是由Unix发展而来的,它不仅继承了UNIX操作系统的特征,而且在许多方面还超

59、过了UNIX系统,另外它还具有许多UNIX所不具有的优点和特性。如它的源代码是开放的,可运行于许多硬件平台,支持多达32种文件系统,支持大量的外部设备等。 它包含人们所期待的操作系统所能拥有的优良特性,包括真正的多任务、虚拟内存、目前最快的TCP/IP驱动程序、共享库和理想的多用户支持;它还符合X/Open标准,具有完全自由的X-Windows实现方式:Linux同UNIX一样,具有最先进的网络特性,且支持所有通用的Internet协议,既可作为客户端也可作为服务器。这些优异的性能,使Linux具有广泛的用途,它可用于下述方面: 个人UNIX工作站 X终端用户和X应用服务器 UNIX开发平台

60、商业开发 网络服务器 Internet服务器 终端服务器、传真服务器、Modem服务器84Linux系统特点及主要功能Linux系统的特点如下: Linux系统是真正的多用户、多任务、多平台操作系统 Linux系统提供具有内置安全措施的分层的文件系统,支持多达32种文件系统 Linux系统提供Shell命令解释程序和编程语言 Linux系统提供强大的管理功能 Linux系统具有内核的编程接口 Linux系统具有图形用户接口 Linux系统具有大量有用的实用程序和通信、联网工具 Linux系统具有面向屏幕的编辑软件 Linux系统组成部分的源代码是开放的,任何人都能修改和重新发布它 Linux系

61、统不仅可以运行自由发布的应用软件,还可以运行许多商业化的应用软件。85Linux系统特点及主要功能 Linux系统的主要功能如下: 1.存储管理 Linux采取页面式存储管理机制,每个页面的大小随处理芯片而异。在Linux中,每一个进程都有一个比实际物理空间大得多的进程虚拟空间,每个进程还保留一张页表,用于将本进程空间中的虚地址变换成物理地址,页表还对物理页的访问权限作了规定,从而达到存储保护的目的。 Linux存储空间的分配遵循的原则是不到有实际需要的时候不分配物理空间,这样可以最大限度的利用物理存储器 2.进程管理 在Linux中,进程是资源分配的基本单位,所有资源都是以进程为对象进行分配

62、的。在一个进程的生命周期中,会用到许多系统资源,Linux的设计可以准确描述进程的状态和资源的使用情况,以确保不出现某些进程过度占用系统资源而导致另一些进程无休止等待的情况。86Linux系统特点及主要功能 Linux创建进程的方法是采用Copy in write技术,不复制父进程的空间,只是复制父进程的页表,使父进程和子进程共享物理空间,并将这个共享空间的访问权限置为只读,这样可以降低系统资源的开销。 3.文件系统 Linux最重要的特征之一就是支持多种不同的文件系统。 在Linux中,一个分离的文件系统不是通过设备标志(驱动器号)来访问,而是把它合到一个单一的目录数结构中去,通过目录访问。

63、 Linux把一个新的文件系统安装到系统单一目录树的某一目录下,则该目录下的所有内容将被新安装的文件系统所覆盖,当文件系统被卸下后安装目录下的文件将会被重新恢复。 为了支持多种文件系统,Linux用一个被称为虚拟文件系统(VFS)的接口层将真正的文件系统同操作系统机器服务器分离开,它能掩盖不同文件系统之间的差异,使所有的文件系统在操作系统和用户程序看来都是相同的。 4.进程间通信 Linux提供多种进程间的通信机制,管道和信号是其中最基本的两种机制,其它还有消息队列、信号灯及共享内存。为支持不同机器之间的进程通信,Linux还引入了Socket机制。87Linux系统的主要产品 Linux系统的主要产品如下所示: Red Hat Linux(小红帽),由Red Hat Software公司发行,其版本为Red Hat Linux 9.0,当今最为流行的Linux套件。它支持的硬件平台较多,安装界面友好,安全性好,在线文档详尽,每一版本还会有一个powertools,适合新手入门使用。 Slackware,由Walnut Creek CDROM公司发行,是历史上使用时间较长的发行版本,用作服务器时表现出较好的性能。但库中包含内容较少。 Debian Linux ,由GUN公司发行,特点是收集的软件非常齐全,是开放式的开发环境。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号