ImageVerifierCode 换一换
格式:PPT , 页数:87 ,大小:984KB ,
资源ID:9434545      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-9434545.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言基础培训.ppt)为本站会员(hwpkd79526)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

C语言基础培训.ppt

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

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

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

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

5、纲,9,数据类型,一个程序应包括数据的描述和动作的描述两方面的内容。著名计算机科学家沃思曾提出一个公式:程序=数据结构+算法,可见数据结构在程序中的地位。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(“%dn”,c

7、); /*printf为格式化输出函数 */* %d表示输出格式化为十进制的整数*/ 运行结果为: 77,12,数据类型,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语言还允许以一个“”开头的特殊字符常量,具体规定如表所示:,看以下下来代码的输出结果: main() printf(“ ab ct dertgn”);printf(“htibjd”); ,14,数据类型,4. 字符型 2) 字符变量用来存放字符变量,且只能放一个字符,定义规则如下:char d ; /*表示d为字符型变量*/ 3) 字符数据在内存中的存储形式和使用方式字符变量在对应的内存中存放的是该字符相应的ASCII码,例如字符a的ASCII码为97,b的ASCII代码为98,而字符与整型变量还可以互相赋值。示例代码: main() char c1,c2;c1=97,c

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

10、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(“%d”,date);输出结果是:1说明:枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再

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

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

13、,7,8,9; /*static是静态数据的意思*/则a0=0a1=1a9=9如果花括号中值的个数少于10,则后面的都为02)字符数组字符数组是一类特殊的数组,数组的每一个元素存放一个字母。下面是它的定义方式:char 数组名常量表达式;如: static char c5=a,e,t,g,b;3).二维数组元素的引用和初始化数组类型 数组名常量表达式1常量表达式2=初始化数据;,21,数据类型,8.指针指针是C语言中的一个重要特色,可以说是C语言的精华。它的概念非常复杂,使用非常灵活,是C语言中最大的难点。一个变量在内存中的地址就称为该变量的指针。我们通过地 址就能找到所需的变量单元。指针变量

14、的定义用下面的形式:类型标识符 *标识符;例如:int *pointer_1;定义了一个指针变量pointer_1,它指向整型变量。如果还定义了一个整型变量i,则可用赋值语句使一个指针变量 指向一个整型变量。如:pointer_1=,22,数据类型,8.指针1.f(int *a,int n) ,23,数据类型,8.指针二维数组是“数组的数组”,例如:定义int a34=1,3,5,7,9.11.13,15,17,19,21,23,则二维数组a是由3个 一维数组所组成的。设二维数组的首行的首地址为2000,则有:,24,数据类型,8.指针指向多维数组的指针变量: 把二维数组a分解为一维数组a0,

15、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列元素的值二维数组指针变量说明的一般形式为:类型说明符 (*指针变量)长度其中类型说明符为所指数组的数据类型。*表示其后的变量 是指针类型。长度表示二维数组分解为多个一维数组时,一维数 组的长度,也就是二维数组的列数。,25,数据类型,8.指针指针函数是返回指针的函数。例如:int *

16、getInt(char * str);函数指针是指向函数地址的指针。例如: int (*func)(char a,char b);指针数组:一个数组,若其元素均为指针类型数据,称为指 针数组,也就是说,指针数组中的每一个元素都相当于一个指针 变量。一维指针数组的定义形式为:类型名 数组名数组长度; 例如:int *name4;char *name=“this”,”is”,”a”,”dog”;指向指针的指针:例如:char *p;p的前面有两个*号。*运算符的结合性是从右到左,因此*p相当于 *(*p),显然*p是指针变量的定义形式。如果没有最前面的*号,那就是定 义了一个指向字符串数据的指针变

17、量。现在它的前面又有了一个*,表示 指针变量p是指向一个字符指针变量的。*p就是p所指向的另一个指针变量,26,数据类型,一、指针变量加减一个整数如:p+,p-,p+i,p-i, 二、指针变量赋值将一个变量地址赋给一个指针变量,如:p= /p1和p2都是指针变量,将p2的值赋给p1,27,数据类型,三、指针变量可以为空值,即该指针变量不指向任何变量,可 以这样表示:p=NULL;四、两个指针变量可以相减如果两个指针变量都指向同一个数组中的元素,则两个指 针变量值之差是两个指针之间的元素个数。,28,数据类型,五、两个指针变量比较若两个指针指向同一个数组的元素,则可以进行比较。指 向前面的元素的

18、指针变量“小于”指向后面元素的指针变量关于void类型:void真正发挥作用在于:1.对函数返回的限定2.对函数参数的限定例如:void abc(void);void指针和const指针:ANSI新标准增加了一种“void”指针类型,即不指定它是指 向哪一种类型数据的指针变量。例如:void * p;表示指针变量p不指向一个确定的类型数据,它的作用仅 仅是用来存放一个地址。void指针它可以指向任何类型数据。也就是说,可以用任 何类型的指针直接给void指针赋值。但是,如果需要将指针的 值赋给其它类型的指针,则需要进行强制类型转换。,29,数据类型,void main(void) const

19、char *str=“hello world”; /在指针定义语句的类型前加const,表示指向的对象是常量/声名一个名为str的指针变量/它指向一个字符型常量,初始化str为指向字符串/hello worldstr0=w; /这条语句是错误的,但可以改变str指针的值printf(“nn%s”,str);str=“hello ,china”;printf(“nn%s”,str); void main(void) char * const str=“hello world”;/在指针定义语句的指针名前加const,表示指针本身是常量/常量指针是一个固定的指针,不可以改变它的值,但它所指的数据可

20、以改变printf(“nn%s”,str);str0=w; /合法str=“hello ,china”;/非法printf(“nn%s”,str); const char * const str=“hello world”;,30,数据类型,9.结构体结构体是C语言提供的一种数据结构,相当于其他高级语言 中的“记录”。下面是定义一个结构体类型的一般形式:struct 结构体名成员列表 变量名列表;对个成员都进行类型说明,如:类型标识符 成员名,31,数据类型,9.结构体下面是一个具体示例:struct studentint num;char name20;char sex;int age;fl

21、oat score;char addr(30); student1=“33”,”zhanwei”,”m”,”22”,”75”,”32#307”);定义了一个struct student类型的变量student1,它包括 num,name,sex,age,score,addr不同类型的数据项,各项初值分别为 33、zhanwei、m、22、75、32#307,32,数据类型,10.共用体几个不同的变量共占同一段内存的结构,称为“共用体”共用体类型变量的定义形式如下:union 共用体名成员列表 变量列表;如:union dataint j;char ch;float f; a,b,c;上面定义了

22、一个union data类型,再将a,b,c定义为union data 类型共用体的引用方式如下:a.j上语句引用共用体变量a中的整型变量j,33,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,34,运算符和表达式,1.运算符C语言提供了十分丰富的运算符,主要有如下几种:算术运算符:+、-、*、/、+等关系运算符:、等赋值运算符:等号(=)及其扩展赋值运算符(+=、-=、*=、/=等)指针运算符:*、&2.表达式用各种运算符将运算对象连接起来的式子,就称为表达式。,35,运算符和表达式,1)算术表达式用算术运算符和括号将运算对象连接起来的式子

23、,称为算术 表达式。包括强制类型转换,可将一个表达式转换成所需类型。 如将x+y的值转换成整型:(int)(x+y);这里请注意两个特殊的算术运算符:+和-,分别为“自增” 和“自减”运算符。i+先使用自身的i值,再自身加i+i;先加i,再使用新的i变量。2)赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为 “赋值表达式”。一般形式为:如:a=87;,36,各类数值型数据之间的混合运算,变量的数据类型是可以转换的,转换的方法有两种,一种是自动转 换,一种是强制转换。自动转换发生在不同数据类型的混合运算时,由 编译系统自动完成。自动换换遵循以下规则:1)若参与运算变量的类型不同,则

24、先转换成同一类型,然后进行计算2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long运算时,先把int量转换成long型再进行计算。3)所有的浮点运算都是以双精度运行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。4)char型和short型参与运算时,必须先转换成int类型。5)在赋值运算中,赋值号两边变量的数据类型不同时,赋值号右边的类型将转换为左边的类型。如果右边量的数据类型长度比左边长时,将丢失一部份数据,这样会降低精度,丢失的部分按四舍五入向前舍入。下图表示了类型自动转换的规则:,37,强制类型转换,强制类型转换时通过类型转换运算来

25、实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类 型说明符所表示的类型。例如:(float) a /把a转换成实型(int) (x+y) /把x+y的结果转换成整型,38,逗号运算符和逗号表达式,在C语言中逗号”,”,也是一种运算符,称为逗号运算符。其 功能是把两个表达式连接起来组成一个表达式。其一般形式为:表达式1,表达式2,其求值过程是分别求两个表达式的值,并以表达式2的值作 为整个逗号表达式的值。对于逗号表达式要说明:逗号表达式一般形式中的表达式1和表达式2页可以又是 逗号表达式例如:表达式1,(表达式2,表达式3),形成嵌套表达式因此可以把逗号表达式

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

27、表达式成立,执行语句1,否则执行语句2. if (表达式1) 语句1;elseif (表达式2) 语句2;elseif (表达式n) 语句n;else 语句m;,42,C程序语句,代码示例如下: /*判断所输入的年份是否为闰年*/ main() int year,leap;scanf(“%df”, 如果输入: 2000 计算机将输出: 2000 is a leap year,43,C程序语句,2.循环语句while循环语句while(表达式)语句;当表达式为真时,执行语句命令。如果循环体包含一个以上 的语句时,应该用大括号“”括起来。do-while语句do语句;while(表达式);与whi

28、le语句表达式不同的是:while语句是先判断,后执行; 而此语句是先执行语句,后判断表达式。,44,C程序语句,2.循环语句for循环语句for(循环变量初值;循环条件;循环变量增值)语句;如循环体语句包含一个以上的语句,应用花括号括起来。下面的程序实现输出100-200间的偶数代码如下所示:main()int n;for(n=100;n=200;n+)if (n%2=0)printf(“%d”,n);,45,C程序语句,3.多分之选择语句switchC语言提供switch语句直接处理多分之选择,它相当于Pascal 语言中case语句。下面是一般形式。switch(表达式)case 常量表

29、达式1:语句1;break;case 常量表达式2:语句2;break;case 常量表达式n:语句n;break;default:语句n+1;执行过程为:当表达式的值与某一个case后面的常量表达式的 值相等时,就执行此cae后面的语句。各个case的常量表达式的值 必须互不相同,它们的出现次序不影响执行结果。,46,C程序语句,/*根据所输入的成绩判断所处的等级*/ main() int score,grade;printf(“please inut your score:”);scanf(“%d”, 如果你输入你的成绩: 76 计算机会算出: Do not play so more!,4

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

31、char)作用是从终端或运输设备中输入一个字符,此函数没有参数变量名=getchar();格式输入语句(scanf)用scanf函数可以输入任何类型的多个数据。scanf(格式控制,地址列表);格式控制是用双引号括起来的字符串,也称为转换控制字符串, 主要用到的格式字符如下。%d用来输入十进制整数%ld用来输入长整型数据%hd用来输入短整型数据%c用来输入单个字符%s用来输入字符串%f用来输入实数 %lf用来输入double型实数,49,C程序语句,2.函数调用语句示例代码如下: main(0 int a,b;scanf(“%d %d”, 运行按如下方式输入a和b的值: 3 4 (输入a,b的

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

33、#include /*include 属于编译预处理中的“文件包含”语句*/main()float c,f;scanf(“%f”,它与赋值表达式的区别是最后的分号,一个语句最后必须以分号结尾。C语言的大多数 语句都是表达式语句。,52,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,53,函数,概述:一个较大的程序可分为若干个程序模块,每一个模块用来实 现一个特定的功能。在高级语言中用子程序实现模块的功能。子程序由函数来完 成。一个C程序可由一个主函数和若干个其他函数构成。函数的调用关系:由主函数调用其他函数,其他函数也可以互相调用。同一个 函

34、数可以被一个或多个函数调用任何多次。,54,函数,函数调用说明:1)一个C程序由一个或多个程序模块组成,每一个程序模 块作为一个源程序文件。对较大的程序,一般不希望把所有内容全放在一个文件中, 而是将他们分别放在若干个源文件中,再由若干源程序文件组成 一个C程序。这样便于分别编写、分别编译,提高调试效率。一 个源程序文件可以为多个C程序公用。2)一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,在程序编译时时以源程序 文件为单位进行编译的,而不是以函数为单位进行编译的。3)所有函数都是平行的,即在定义函数时是分别进行的, 是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套

35、 定义。函数间可以互相调用,但不能调用main函数,因为main函 数是系统调用的。,55,函数,函数调用说明:4)从用户使用的角度看,函数有两种:标准函数,即库函数。这是由系统提供的,用户不必自己 定义这些函数,可以直接使用它们。应该说明,不同的C系统提 供的库函数的数量和功能会有一些不同,当然许多基本的函数是 共同的。用户自己定义的函数,用以解决用户的专门需要。6)从函数的形式看,函数分两类:无参函数。有参函数。,56,函数,一个较大程序一般应分为若干个程序模块,在高级语言中用 子程序来实现模块的功能。函数用如下方式定义:类型标识符 函数名(形式参数列表)形式参数说明说明部分语句下例是一个

36、求解两数之和的函数: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,%d”,如果输入:54,32则得到如下输出:The sum of a and b is 86,58,函数,有关形参与实参的一些重要说明:1)在定义函数中指定的形参时,它们并不占内存中的存储 单元。只有在发生函数调用时,函数max中的形参才被分配内存 单元。在调

37、用结束后,形参所占的内存单元也被释放。2)实参可以是常量、变量或表达式,如:max(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参。3)在被定义的函数中,必须指定形参的类型。4)实参与形参的类型应相同或赋值兼容。如果实参为整型 而形参为实型,或者相反。例如实参值a为3.5,而形参x为整型,则将实数3.5转换成整 数3,然后送到形参b.字符型与整型可以互相通用。,59,函数,5)在C语言中,实参向对形参的数据传递时“值传递”(相当于 COPY),单项传递,只由实参传给形参,而不能由形参传回来 给实参。在内存中,实参单元与形参单元式是不同的单元。在调用函数时,给形参分配存储单元,并

38、将实参对应的值传 递给形参,调用结束后,形参单元被释放,实参单元仍保留并维 持原值。因此,在执行一个被调用函数时,形参的值如果发生改 变,并不会改变主调函数的实参的值。,60,函数,关于函数的返回值的一些说明:1)函数的返回值是通过函数中的return语句获得的:return语句将被调用函数中的一个确定值带回主调函数中去如果需要从被调用函数带回一个函数值供主调函数使用,被调用函 数中必须包含return语句。如果不需要从被调用函数带回函数值可以不要return语句。一个函数中可以有一个以上的return语句,执行到哪一个return语句, 哪一个语句起作用,return语句后面的括弧也可以不要

39、,如return z;等价 于return (z);return后边的值可以是一个表达式。2)函数的返回值应当属于某一个确定的类型,在定义函数时指定 函数返回值的类型。特别提示:在C语言中,凡不加类型说明的函数,自动按整型处理。3)对于不带返回值得函数,应当用”void”定义函数为”无类型”(或称 空类型”)这样,系统就保证不使函数返回任何值,即禁止在调用函数中使用 被调用函数返回值。此时在函数体中不得出现return语句。,61,函数,对被调用函数的声明和函数原型:在一个函数中调用另一个函数(即被调用函数)需要具备哪些条件呢?1)首先被调用的函数必须是已经存在的函数(是库函数或用户自定 义函

40、数)。2)如果使用库函数,还应该在本文件开头用#include命令将调用有关 库函数时所需用到的信息“包含”到本文件中来。3)如果使用用户自定义的函数,而该函数的位置在调用它的函数 (即主调函数)的后面(在同一个文件中),应该在主调函数中为被调 函数作声明。关键词区别以下:声明一词的原文是declaration,过去在许多书中把它译为说明。声明的作 用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在 遇到函数时,编译系统能正确识别函数并检查调用是否合法。(例如函数 名是否正确,实参与形参的类型和个数是否一致)。函数的定义和声明不是一回事。函数定义是指对函数功能的确立,包 括指定函

41、数名,函数值类型、形参及其类型、函数体等,它是一个完整的 、独立的函数单位(占内存),62,函数,函数的嵌套调用嵌套定义就是在定义一个函数时,其函数体内又包含一个函 数的完整定义。然而,C语言不能嵌套定义函数,但可以嵌套调用函数,也 就是说,在调用一个函数的过程中,又调用另一个函数。 main() a(); a() b(); b() return 0; ,63,函数,局部变量和全局变量局部变量:在一个函数内部定义的变量是内部变量,它只在 本函数范围内有效,也就是说只有在本函数内才能使用它们,在 此函数以外是不能使用这些变量的。这称为局部变量。说明:1)形式参数是局部变量。2)在一个函数内部,可

42、以在复合语句中定义变量,这些变量只在本复合语句中有效。这种复合语句也称为分程序或程序块。示例: void main() int a,b;int c;c=a+b; /c在此范围内有效,a,b在此范围内也有效 ,64,函数,全局变量:在函数内定义的变量是局部变量,而在函数之外定义的变量 称为外部变量,外部变量是全局变量(也称为全程变量)全局变量可以为本文件中的函数所共用。它的有效范围为从 定义变量的位置开始到本文件结束。,65,函数,全局变量:全局变量在程序的全部执行过程中都占用存储单元,而不是 仅在需要时才开辟单元。使用全局变量过多,会降低程序的清晰性,人们往往难以清 楚地判断出每个瞬时各个外部

43、变量的值。在各个函数执行时都可 能改变外部变量的值,程序容易出错。因此,要限制使用全局变 量。它使函数的通用性降低了,因为函数在执行时依赖于其所在 的外部变量。如果一个函数移到另一个文件中,还要将有关的外 部变量及其值一起移过去。但若该外部变量与其他文件的变量同 名时,就会出现问题,降低了程序的可靠性和通用性。一般要求把C程序中的函数作成一个封闭体,除了可以通过 “实参-形参”的渠道与外界发生联系外,没有其他渠道。,66,函数,变量的存储类别:动态存储方式与静态存储方式:前面介绍了从变量的作用域(即从空间)角度平分,可以分为全局 变量和局部变量。从变量值存在时间(即生存期)角度来分,又可以分为

44、静态存储方 式和动态存储方式。静态存储方式是指在程序运行期间在静态存储区分配存储空间的方式。动态存储方式则是在程序运行期间根据需要在动态存储区分配存储 空间的方式。用户存储空间可以分为三部分:1.程序区2.静态存储区3.动态存储区在C语言中每一个变量和函数有两个属性:数据类型和数据的存储类 别。对数据类型(如整型、字符型等)。存储类别指的是数据在内存中 存储的方式。存储方式分为两类:静态存储和动态存储具体包含四种:自动的(auto),静态的(static),寄存器的(register), 外部的(extern)根据变量的存储类别,可以知道变量的作用域和生存期,67,函数,auto变量函数中的局

45、部变量,如不专门声明为static存储类别,都是 动态的分配存储空间的(栈),数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定 义的变量),都属此类,在调用该函数时系统会给它们分配存储 空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。自动变量用关键字auto作 存储类别的声明。int f(int a) auto int b,c=3; 关键字auto可以省略,auto不写则隐含定为“自动存储类别”, 属于动态存储方式。,68,函数,用static声明局部变量:有时希望函数中的局部变量的值在函数调用结束后不消失而 保留原值,即其占用的存储单元

46、不释放,在下一次该函数调用时 ,该变量已有值,就是上一次函数调用结束时的值。这时就应该指定该局部变量为静态局部变量,用关键字static 进行声明。对静态局部变量的说明:1.静态局部变量属于静态存储类别,在静态存储区内分配存 储单元。在程序整个运行期间都不释放。2.对静态局部变量是在编译时赋初值的,即只赋值一次,在 程序运行时它已有初值。以后每次调用函数时不再重新赋初值, 而只是保留上次函数调用结束时的值。,69,函数,3.如在定义局部变量时不赋初值的话,则对静态局部变量来 说,编译时自动赋初值0(对数值型变量)或空字符串(对字符 变量)4. 虽然静态局部变量在函数调用结束后仍然存在,但其他函

47、 数是不能引用它的。,70,函数,register变量:一般情况下,变量(包括静态存储方式和动态存储方式)的 值是存放在内存的。当程序中用到哪一个变量的值时,由控制器发出指令将内存 中该变量的值送到运算器中。经过运算器进行运算,如果需要存 数,再从运算器将数据送到内存存放。,71,函数,register变量:如果一些变量使用频繁(例如在一个函数中执行1000次循环, 每次循环中都要引用某局部变量),则为存储变量的值要花费不 少时间。为提高执行效率,C语言允许将局部变量的值放在CPU中的 寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存 中去存取。由于对寄存器的存储速度远高于对内存的存取

48、速度,因此这 样做可以提高执行效率。这种变量叫做寄存器变量,用关键字register作声明。用extern声明外部变量:外部变量即全局变量,它的作用域是从变量的定义处开始, 到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编 译时将外部变量分配在静态存储区。有时需要用extern来声明外部变量,以扩展外部变量的作用域,72,C语言概述 数据类型 运算符和表达式 C程序语句 函数 编译预处理 Linux系统概述,培训大纲,73,编译预处理,通常在C编译系统对程序进行编译前,先对程序中一些特殊的命令 进行“ 预处理”,然后将预处理的结果和源程序一起进行编译处理, 得到目标代码

49、。1.宏定义1)不带参数的宏定义用一个指定的标识(即名字)来代表一个字符串,它的一般形式如下:#define 标识符 字符串如: #define PI 3.1415926这里需要注意的有以下几点:宏定义不是C语句,结尾不必加分号。若加上分号则连分号也一起 被置换。通常#include 命令写在文件开头,位于函数之前,作为文件的一部 分,在此文件范围内起作用,其作用域为宏定义命令起到源程序结束。如果要终止其作用域可使用#undef命令。对程序中用双引号括起来的字符,即使与宏名相同,也不作替换进行宏定义时,可以引用已定义的宏名,可以层层替换。在编写源程序时,所有的3.1415926都可由PI代替,而对源程序做编 译时,将先由预处理程序进行宏代换,即用3.1415926表达式去置换所 有的宏名PI,然后再进行编译。,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报