内部变量外部变量课件_第1页
内部变量外部变量课件_第2页
内部变量外部变量课件_第3页
内部变量外部变量课件_第4页
内部变量外部变量课件_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

6.2内部变量与外部变量C语言中,将变量的有效范围称为变量的作用域。所有的变量都有自己的作用域,变量定义的位置不同,其作用域也不同,作用域是从空间角度对变量特性的一个描述。按照变量的作用域,将C语言中的变量分为内部变量和外部变量。6.2.1内部变量1.内部变量的概念和定义在一个函数(包括main()函数)内部或复合句内部定义的变量称为内部变量,自然,函数的形参属于内部变量。内部变量只在该函数范围内或该复合句范围内有效。也就是说,内部变量的作用域局限于定义它的函数或复合句内部,在此函数之外或此复合句之外就不能使用这些变量了。所以,内部变量也称局部变量。

前面我们使用的所有变量都属于内部变量,例如,95页【例6.10】中,void()函数中定义的变量i,其作用域局限于void()函数内,在main()函数中无效;main()函数中定义的变量i也只在main()函数内有效.再如:96页,fun1()函数中定义的变量p1,p2,p3,其作用域局限于fun1()函数内,在main()函数中无效;fun2()函数中定义的变量p4,p5,p6,其作用域局限于fun2()函数内,在main()函数中无效;main()函数中定义的变量x,y,a,b也只在main()函数内有效.if(num1>num2){inttemp;temp=num1;num1=num2;num2=temp;}if(num2>num3){inttemp;temp=num2;num2=num3;num3=temp;}if(num1>num2){inttemp;temp=num1;num1=num2;num2=temp;}printf("Threenumbersaftersorted:%d,%d,%d\n",num1,num2,num3);}程序运行情况如下:Pleaseinputthreenumbers:8,0,5↙Threenumbersaftersorted:0,5,8本例中的temp变量的作用域局限于复合句内。6.2.2外部变量1.外部变量的概念和定义在函数外部定义的变量称为外部变量。外部变量不属于任何一个函数,其作用域是:从外部变量的定义位置开始,到本源文件结束为止。外部变量可被作用域内的所有函数直接引用,所以外部变量又称全局变量。例如97页例题中a,b存储类别就是外部型说明:(1)在同一源文件中,允许外部变量和内部变量同名。同名时在内部变量的作用域内,外部变量将被屏蔽而不起作用,如下例所示。【例6.6】外部变量与内部变量同名举例。inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;returnc;}

从本例可以看出,外部变量与内部变量同名时容易混淆其作用域,因此在程序设计中应尽量避免其同名。(2)外部变量的作用域是从定义点开始到本源文件结束为止的。如果定义点之前的函数需要引用这些外部变量,则需要在函数内对被引用的外部变量进行声明。外部变量声明的一般形式为extern类型名外部变量[,外部变量2…];可通过对外部变量的声明将其作用域延伸到定义它的位置之前的函数中。

外部变量的定义和外部变量的声明是两回事。外部变量的定义,必须在所有的函数之外,且只能定义一次。而外部变量的声明,出现在要使用该外部变量的函数内,而且可以出现多次。外部变量在定义时分配内存单元,并可以初始化;外部变量声明时,不能再赋初值,只是表明在该函数内要使用这些外部变量。如97页例题中b,c是外部变量的定义,d,e是外部变量的说明。

6.2.4内部函数和外部函数

函数在本质上是全局的,因为一个函数需要被其他函数调用。那么,当一个源程序由多个源文件组成时,在一个源文件中定义的函数,能否被其他源文件中的函数调用呢?C语言根据函数能否被其他源文件中的函数调用,将函数分为内部函数和外部函数。static类型名函数名(参数定义表){函数体}

关键字static译成中文就是“静态的”,所以,内部函数又称静态函数。但此处,static的含义不是指存储方式,而是指函数的作用域仅局限于本源文件内。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其他源文件中的函数同名。外部函数1.外部函数的概念如果在一个源文件中定义的函数,除可被本源文件中的其他函数调用外,也可被其他源文件中的函数所调用,则这种函数称为外部函数。外部函数的作用域是整个源程序。2.外部函数的定义在定义函数时,如果没有加关键字static,或冠以关键字extern,表示此函数是外部函数,如下所示:[extern]类型名函数名(参数定义表){函数体}与调用本源文件中的函数一样,需要对被调用的外部函数进行如下声明:[extern]类型名函数名(参数类型表)[,函数名2(参数类型表2)…];6.3变量的动态存储与静态存储6.3.1动态存储与静态存储的概念在C语言中,每个变量都有两个属性:数据类型和存储类型。存储类型是指变量在内存中存储的方式。各种变量的作用域不同,就其本质来说是因为变量的存储类型不同。变量的存储类型分为静态存储和动态存储两大类。由此可知,静态存储变量是一直存在的,而动态存储变量则时而存在、时而消失。这种由于变量存储方式的不同而产生的特性,称为变量的生存期。生存期表示了变量存在的时间。生存期和作用域分别从时间和空间这两个不同的角度描述了变量的特性。这两者既有联系,又有区别。一个变量究竟属于哪一种存储方式,并不能仅从其作用域来判断,还应有明确的存储类型定义。因此,变量定义的完整形式应为[存储类型]数据类型变量名[,变量名2…];

在C语言中,对变量的存储类型定义有以下四种:自动变量(auto)、寄存器变量(register)、外部变量(extern)和静态内部变量(static)。自动变量和寄存器变量属于动态存储方式,外部变量和静态内部变量属于静态存储方式。对一个变量的定义,不仅应定义其数据类型,还应定义其存储类型。static数据类型内部变量表;存储特点:(1)静态内部变量属于静态存储,是在编译时为其分配存储单元的,其生存期为整个程序执行期间。在程序执行过程中,即使所在函数被调用结束也不释放,一直存在。但其他函数不能引用它们。(2)静态内部变量是在编译时赋初值的,若定义而不初始化,则自动赋以0(整型和实型)或\0(字符型),也即系统会自动初始化为0值。每次调用静态内部变量所在的函数时,不再重新赋初值,只是保留上次调用结束时的值,如99页例题所示。【例6.7】输出1~4的阶乘。longfactorial(intn){registerlongi,fact=1;/*定义寄存器变量*/for(i=1;i<=n;i++)fact*=i;return(fact);}main(){intnum;for(num=1;num<=4;num++)printf("%d!=%ld\n",num,factorial(num));}程序运行结果如下:1!=12!=23!=64!=246.3预处理程序6.3.1文件包含文件包含是C语言预处理程序的一个重要功能。其命令行的一般形式为#include"文件名"或#include<文件名>以前已多次用此命令包含过TurboC库函数的头文件。例如:#include"stdio.h"及#include"math.h"说明:(1)包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。如“#include”stdio.h“”或“#include<math.h>”。但是这两种形式是有区别的:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。(2)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。(3)文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。6.3.2宏替换在C语言源程序中,允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。宏提供了一种词法符号替换机制,它们可带也可不带类似函数参数的形式参数。#define指令定义宏。说明:

1)根据一般C语言程序中变量的命名规则,符号常量的定义一般习惯使用大写字母表示,这主要是因为通常在一般变量的定义中,常使用小写字母的原因。当然,符号常量也可以小写字母命名2)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,属于一种简单的代换。3)宏定义常用于程序中反复使用的表达式4)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域,可使用#undef命令。例如:#definePI3.14159main(){}#undef/*终止PI的作用域*/f1()利用#undef后,使得PI只在main函数中有效,在f1()函数中无效。带参数宏定义C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为#define宏名(形参表)字符串其中,在字符串中含有各个形参。带参数宏调用的一般形式为宏名(实参表);例如:#defineM(y)y*y+3*y/*宏定义*/

k=M(5); /*宏调用*/在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为k=5*5+3*5;【例6.8】/*程序功能:带参宏示例,实现自键盘输入两个数值的比较并输出较大值*/#defineMAX(a,b)(a>b)?a:bmain(){intx,y,max;printf("inputtwonumbers:");scanf("%d%d",&x,&y);

温馨提示

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

评论

0/150

提交评论