变量的作用域和生存期
生存周期与作用域
3.静态存储方式
ห้องสมุดไป่ตู้
4.在一个项目里的各个源文件中都是有效的
静态全局变量:
1.需要用static声明
2.同全局变量,但在程序编辑阶段分配内存空间
3.静态存储方式
4.只在它声明的源文件中是有效的
static生命周期
静态变量的类型说明符是static。静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。对于自动变量,它属于动态存储方式。但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。
2.静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
1. 静态局部变量
在局部变量的说明前再加上static说明符就构成静态局部变量。例如:
static int a,b; static float array[5]={1,2,3,4,5};
静态局部变量属于静态存储方式,它具有以下特点:
变量的作用域和生存期
变量的作用域局部变量和全局变量在函数和复合语句内定义的变量,只在本函数或复合语句范围内有效(从定义点开始到函数或复合语句结束),他们称为内部变量或局部变量。
在函数之外定义的变量是外部变量,也称为全局变量(或全程变量)。
如果在一个函数中全局变量和局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即他不起作用,此时局部变量是有效的。
全局变量的作用是增加函数间数据联系的渠道。
虽然全局变量有以上优点,但建议不必要时不要使用全局变量,因为全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
在程序设计时,对模块的划分要求:内聚性强,与其他模块的耦合性弱,这样便于程序的移植,可读性强。
变量的生存期变量的存储方式分为两种:静态存储方式和动态存储方式。
静态存储方式是指在程序与性能期间由系统在静态存储区分配存储空间的方式,在程序运行器件不释放;而动态存储方式则是在函数调用期间根据需要在动态存储区分配存储空间的方式。
这就是变量的存储区别。
Auto----声明自动变量函数中的形参和在函数中定义的变量都属于此类。
在调用这些函数时,系统给这些变量分配存储空间,函数调用结束时就自动释放这些存储空间。
因为这类局部变量称为自动变量(auto 变量)。
关键字auto作为存储类别的声明。
Auto可省略Static-----声明静态变量希望函数中的变量的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。
这时就用关键字static指定该局部变量为“静态存储变量”。
对静态局部变量的说明静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。
而自动变量(即动态局部变量)属于动态存储类别,占胴体啊存储区空间而不占静态存储区空间,函数调用结束后即释放。
对静态局部变量是在编译时赋初值的,即只赋初值一次,在以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
变量的作用域和生存周期
变量的作⽤域和⽣存周期局部变量的作⽤域⼀般认为在函数体内有效,其内存分配管理和销毁由编译器来实现。
当函数执⾏完成返回时,局部变量将全部销毁,则其⽣命周期也随之结束。
全局变量的⽣命周期等于程序执⾏时间,程序开始执⾏时,全局变量将被初始化。
举个例⼦:int tmp;int main(){for(int i = 0;i< 100;++i) { ...; ...; }}可知i就是for循环内的⼀个局部变量,如果在for循环的花括弧外访问i,则会提⽰如下错误:error C2065: ‘i’ : undeclared identifiertmp就是⼀个全局变量,程序中的任何函数都可以访问它,这实现了数据共享。
但任何函数也可以修改这个全局变量,使数据发⽣被篡改的可能。
再举个例⼦说明⼀下,关于函数返回值的问题:#include "stdafx.h"#include <iostream>//using namespace std;//不建议直接使⽤using std::cout;//⽤到哪个就using 哪个,虽然⿇烦,但是这是⼀个好的习惯using std::endl;int*test(){int intArray[3] = {0,1,2};return intArray;}int main(){int*ptrArray;ptrArray = test();for(int i = 0;i < 3;++i)cout<<ptrArray[i]<<' ';cout<<endl;return0;}该程序编译时会出现如下警告:warning C4172: returning address of local variable or temporary运⾏结果: 看到这⼤家可能感到奇怪,为什么输出不是0,1,2呢?这是因为test函数运⾏结束,返回main函数,其函数体内的所有变量(stack分配)都被系统回收。
变量的生命周期与作用域
作用域和生存周期是完全不同的两个概念。
作用域可以看作是变量的一个有效范围,就像网游中的攻击范围一样;生存周期可以看成是一个变量能存在多久,能在那些时段存在,就像网游中的魔法持续时间……简单的以一个局部变量来举个例子:在main函数中声明了变量a,那么a的作用域就是main函数内部,脱离了main函数,a就无法使用了,main函数之外的函数或者方法,都无法去使用a。
那么a的生存周期是指a在那些时候存在,具体到这个例子,a什么时候存在,要取决于main函数,或者说,main函数只要被调用,且调用没有完成,那么a就将存在。
除此以外的情况,a都将被释放。
生存周期也可以理解为从声明到释放的之间的时间。
变量具体可以分为全局变量、静态全局变量、静态局部变量和局部变量。
按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。
局部变量的值不可知。
总的分为局部变量和全局变量:局部变量又可分为动态局部变量(没特殊声明的变量一般都为动态局部变量)和静态局部变量(用static关键字声明的变量如:static int a;);两者的区别在于:静态的局部变量生存期比动态的局部变量来的长,动态的局部变量的生存期为所定义的范围内,如在函数内定义的,函数结束,变量也跟着结束,变量的值不会保存下来。
而静态变量的生存期为整个源程序(也可说是一个文件,不同环境不同称呼)。
而两者的作用域是一样。
只能在定义他的函数内起作用,离开了这个函数就不起作用了。
全局变量:在函数之外定义的变量称为全局变量。
全局变量可以为本文件中其他函所共用(作用域),它的有效范围(生存期)从定义变量开始到文件结束。
变量的生存期和作用域
变量的⽣存期和作⽤域变量的⽣存期和作⽤域是个很基础但⼜很重要的问题,所以我打算写⼏百字重温⼀下。
变量的⽣存期是指变量在什么时间段存在。
变量的作⽤域是指变量在哪些代码块中能够被访问。
⼀般来说变量⽣存期包含作⽤域。
即在变量起作⽤的代码段,这时变量已经分配了存储空间。
也就是说,变量可能已经分配存储空间,但它不能被访问。
在程序加载到内存中时,有些变量就已经分配存储空间,并且这个存储空间直到整个程序执⾏完毕,从内存中退出时才会被释放。
这些变量的⽣存周期就为整个程序的⽣存周期。
如全局变量和静态局部变量。
它们的差别是全部变量的作⽤域⼀般为定义处到它所在⽂件结束。
要在全局变量定义位置之前或其他源⽂件中引⽤该全局变量,需要⽤extern来扩展该全局变量的作⽤域。
程序中有的变量在程序加载到内存中时并不分配存储空间,⽽是到定义它的函数被调⽤执⾏时才会临时分配存储空间,并且⼀旦该函数执⾏完毕返回到被调⽤处,这些变量的存储空间会被回收。
如⾮静态局部或⾃动变量。
⼀个局部变量,如果没有⽤static修饰则⾃动为auto,即这种情况下⽣存期为函数调⽤到函数返回这个时间段。
对于⾮静态局部变量,⽣存期和作⽤域都为其所在定义的函数对于静态局部变量,它的⽣存期是整个程序⽣命周期,但作⽤域依旧为定义它的函数内部全局变量与静态局部变量如果未初始化,值为0⾮静态局部变量未初始化,值不定。
1. ⼀般情况下全局变量定义函数外,局部变量定义函数内;全局变量作⽤范围是全局,局部变量作⽤范围在函数内;2. 静态变量定义在函数外,则为静态全局变量,作⽤范围为当前⽂件;定义在函数内,则为局部静态变量,作⽤范围同局部变量;3. 如果在全局范围要经常⽤到某个值,则设置为静态变量,否则定义为普通全局变量即可;4. c、c++和java可以定义静态变量,go和python不能定义静态变量;。
变量的作用域与生存期
static int x=10; void add2() { extern int y; x+=10; y+=2; printf("in add2 x=%d\n",x); } 运行结果: in add1 x=4 in add2 x=20 in add1 x=6 in add2 x=30 x=6;y=13
1、只有局部自动变量和 形式参数可以作为寄存器 变量 2、不能定义任意多个寄 存器变量 3、局部静态变量不能定义 为寄存器变量
静态内部变量
格式:static 类型 变量名列表; static int a; 形参不能是定义成 static。 内部变量定义成 static 后,作用域不变,但生存 期变长,在整个程序执行前就存在,直到程序结 束才清除掉,其生存期为整个程序的运行期。 使用注意:
例 外部变量副作用
int i; void main() { void prt(); for(i = 0;i < 5;i++) prt(); } void prt() { for(i = 0;i < 5;i++) 运行结果:***** printf(“%c”,’*’); printf(“\n”); }
例 使用寄存器变量
int fac(int n) { register int i, f = 1; for(i = 1;i <= n;i++) f = f*i; return(f); } void main() { int i; for(i = 1;i <= 1000;i++) printf(“%d!=%d\n”,i,fac(i)); }
外部变量增 加了函数间 数据联系的 渠道 max min 作 用 域
面向对象程序设计复习总结题(含部分答案)
《面向对象程序设计》复习要点及复习题(一)复习要点1.标识符、基本数据类型(字节数)、构造数据类型、运算符的种类、运算符的优先级和结合性、控制台输入和输出2.三种基本控制结构、if…else语句、switch语句、for语句、while语句、do…while语句、跳转语句;函数参数传递、函数重载、内联函数;标识符的作用域和生存期。
3.类的定义和使用、this指针、构造函数和析构函数、组合技术、静态成员、友元、运算符重载4.指针与数组、二级指针、动态内存的分配与释放、深复制与浅复制、递归。
5.派生类的构造与析构、派生类与基类的赋值兼容、多重继承与虚基类。
6.虚函数与动态绑定、纯虚函数与抽象类(二) 复习题一、单项选择题。
1.在switch语句中,为了结束分支,一般应在每个分支的结尾处加上语句(C)。
A. continueB. gotoC. breakD. default2.说明友元函数的关键字是(D)。
A. inlineB. virtualC. staticD. friend3.下面对指向常量的指针描述正确的是(C)。
A. 只能指向常量B. 指向的数据可以被修改C. 可以指向普通变量D. 必须进行初始化4.友元函数没有(A)。
A. this指针B. 返回类型C. 函数名D. 参数5.关于重载,(A)不正确。
A. 类名可以重载B. 函数名可以重载C. 运算符可以重载D. 缺省参数是重载的一种方式6.用new分配n维数组空间,首地址赋予指针p,则p应为指向(C)维数组的指针。
A. 0B. 1C. n-1D. n7.为类X重载前缀自增运算,则函数返回类型应为(C)。
A. XB. X*C. X&D. int8.以下(A)未调用构造函数(X为类名)。
A. X*p;B. X obj;C. X obj(1);D. X obj=2;9.若在类外有函数调用X::func();则函数func是类X的(C)函数。
ExcelVBA解读(122):变量的作用域和生存期
ExcelVBA解读(122):变量的作用域和生存期excelperfect变量的作用域,就是该变量在程序中的影响范围。
也就是说,在声明一个变量后,能够在哪些代码中使用该变量。
而变量的生存期,就是变量所赋的值能够存在的时间。
过程级变量看看下面的示例代码:Sub test()Dim i As LongFor i = 1 To 10Debug.Print iNext iEnd Sub代码中的变量i的作用域仅限于test过程,在该过程之外是无效的。
这里的变量i是过程级变量。
下面,再在同一模块中编写过程test1,代码如下:Sub test()Dim i As LongFor i = 1 To 10Debug.Print iNext iEnd SubSub test1()Dim i As LongFor i = 1 To 10Dim j As Longj = 2Debug.Print i * jNext ij = j 1Debug.Print jEnd Sub我在test1过程中声明了与test过程同名的变量i,两个过程互不影响,过程test中的变量i仅作用于test过程,同样过程test1中的变量i也仅作于test1过程。
当test过程执行完毕,该过程的变量i也完成使命,test1过程的变量i也是如此,因此过程中的变量i的生存期也仅限于该过程。
从test1过程可以看到,变量可以在过程中的任意位置声明。
但要注意的是,只有在声明该变量之后才能使用。
也就是说,在test1过程中,变量j的作用域仅限于该过程中其声明语句之后的范围,如下图1所示。
图1在VBA中,通常在过程的开头集中声明要使用的变量。
在一个过程内,变量的名称不能相同,即便将变量声明放置在不同的语句块内也不行(这与C等编程语言不同),否则会导致编译错误,如下图2所示。
如果在过程内部使用关键字Static声明变量,该变量的作用域虽然仅限于该过程内,但将会一直存在且保留最新值。
面向对象的程序设计试题库
面向对象的程序设计一、单项选择题1、下面那种结构不是C++的控制结构()A 顺序结构B 选择结构C 循环结构D 判断结构答: D2、下列是C++语言中合法标识符的是()。
A.3three B.ifC._1oneD.while答:C3、下列是合法的C++语言语句的是()。
A.if(x>0) then x=x-1;else x=x+1;B.if(x>0) x=x-1;else x=x+1;C.if x>0 x=x-1;else x=x+1;D.if x>0 x=x-1;答:B4、下面那一种不是计算机内部表示整数的方法()A 二进制码B原码C 补码D反码答:A5、在C++语言中,下列数为合法的实数的是()。
A.5E-3B.5E-3.5C. E5D.-3.5E答:A6、C++语言中数据类型最大的是()A longB floatC intD char7、如果一个函数可以在定义中直接或间接的调用自己,这样的函数称为()。
A.函数声明B.嵌套函数C.定义函数D.递归函数答:D8、表达式0x55^0xB4的结果为()。
A.0xF5B.0x15C.0xE1D.0x1E答:C9、C++中,源代码文件后缀为()A .cppB .objC .exeD .c答: A10、0X5A&0XB7结果是()A 0X13B 0X12C 0X14D 0X15答: B二、填空题1、程序的基本控制结构包括()、()和()。
答:顺序结构,选择结构,循环结构2、用来解决问题的,与有限多个步骤组成的具体过程称为()。
答:算法3、整数类型变量a和b被初始化为3和10,则循环语句while(a<=b) a=a+2;共执行()次,执行完语句后a的值为(),b的的值为()。
答:4,11,10)。
答:警告信息,致命错误5、计算机中的数据可以分为()和()两大类。
答:数值型、字符型6、字符型数据有两种编码方法:()和()答:有美国国家标准局制定的ASCII码、IBM公司提出的EBCDIC码7、通过C++ 语言中的()机制,可以从现存类中构建其子类。
关于在VB中变量的作用域及生命周期
关于在VB中变量的作用域及生命周期近日,连续碰到好几个朋友,询问有关VB中变量的声明以及作用域的问题,结合自己的理解和经验,写一篇文章,仅供参考,不当之处请指正。
一.VB应用程序的组成:为了了解变量的作用域,有必要回顾,在一个完整的VB工程项目中,包括了哪些组成部分?通常一个完整的VB程序里,会包括:窗体模块(.Frm文件)、标准模块(.Bas文件)和类模块(.Cls文件),见下图:根据变量的作用范围(作用域)可分为3个层次:局部变量(私有变量)、模块级变量和全局变量(公共变量)。
下面来详细说明三种变量的作用范围及使用规则。
二.局部变量:1.局部变量的作用域:顾名思义,就是只能在局部范围内被程序代码识别和访问的变量。
这类变量就是在过程(或函数)里,用Dim关键字进行声明的变量。
例如:在窗体上添加一个按钮,单击按钮,完成的功能是:输入2个数,计算并输出它们的和。
完整的代码如下:Option ExplicitPrivate Sub Command1_Click()Dim x As Single ‘声明局部变量Dim y As Single ‘声明局部变量Dim R As Single ‘声明局部变量x = Val(InputBox("请输入第1个加数:"))y = Val(InputBox("请输入第2个加数:"))R = x + yEnd Sub这里,是在按钮Command1的单击事件过程Click()里编写代码,用Dim声明了三个变量x、y、R,它们就属于局部变量。
它们只能被这个过程访问使用。
其它的过程里访问不到它们,甚至在一个程序的任何其它地方都访问不到它们。
这就是局部变量的作用域。
而且,这些变量只有在该过程的执行阶段才会存在,也就是说当系统执行这一段代码的时候:从Private Sub Command1_Click()进入过程的时候起,这3个变量才是存在的,当执行结束,从End Sub退出这段代码后,这些变量就消失了,这就是所谓的变量的生命周期。
变量的作用域和生命周期
变量的作用域和生命周期在计算机编程中,变量是用来存储和表示数据的一种基本概念。
变量的作用域和生命周期是编程语言中非常重要的概念,它们决定了变量在程序中的可见性和存在时间。
作用域是指变量在程序中的可见范围。
在不同的编程语言中,作用域可以分为全局作用域和局部作用域。
全局作用域意味着变量在整个程序中都是可见的,而局部作用域则只在特定的代码块或函数中可见。
在大多数编程语言中,变量的作用域由它们的声明位置决定。
例如,在C语言中,变量的作用域可以是函数内部或函数外部。
在函数内部声明的变量只在该函数内部可见,而在函数外部声明的变量则在整个程序中都是可见的。
作用域的概念对于程序的可读性和可维护性非常重要。
通过合理地定义变量的作用域,可以避免命名冲突和意外的数据修改。
同时,作用域的概念也有助于程序员理解代码的执行过程和变量的使用方式。
除了作用域,变量还有一个重要的概念是生命周期。
生命周期指的是变量存在的时间范围。
在程序执行过程中,变量可以被创建、修改和销毁。
变量的生命周期也与其作用域密切相关。
在局部作用域中声明的变量通常具有较短的生命周期,它们在离开作用域时会被销毁。
这样可以释放内存资源,并避免不必要的数据存储。
相比之下,全局作用域中声明的变量通常具有较长的生命周期,它们在整个程序执行过程中都存在。
这些变量可以被多个函数或代码块访问和修改,但也需要注意避免滥用全局变量,以免导致代码的可读性和可维护性下降。
在一些编程语言中,还存在其他类型的作用域和生命周期。
例如,面向对象编程中的类成员变量具有类作用域和对象生命周期。
这些变量在类的所有对象中都是可见的,它们的生命周期与对象的创建和销毁相关。
总结起来,变量的作用域和生命周期是编程语言中非常重要的概念。
通过合理地定义变量的作用域和生命周期,可以提高程序的可读性、可维护性和性能。
在编程过程中,我们应该根据实际需求和编程语言的规范来选择合适的作用域和生命周期,以实现代码的正确性和效率。
C语言的变量的作用域和生存期
C语言的变量的作用域和生存期一、c程序存储空间布局C程序一直由下列部分组成:1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
5)堆——动态存储分。
|-----------|| ||-----------|| 栈 ||-----------|| | || /|/ || || || /|/ || | ||-----------|| 堆 ||-----------|| 未初始化 ||-----------|| 初始化 ||-----------|| 正文段 ||-----------|二、面向过程程序设计中的static1. 全局静态变量在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在) 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)3)作用域:全局静态变量在声明他的文件之外是不可见的。
准确地讲从定义之处开始到文件结尾。
看下面关于作用域的程序://teststatic1.cvoid display();extern int n;int main(){n = 20;printf("%d/n",n);display();return 0;}//teststatic2.cstatic int n; //定义全局静态变量,自动初始化为0,仅在本文件中可见void display(){n++;printf("%d/n",n);}文件分别编译通过,但link的时候teststatic1.c中的变量n找不到定义,产生错误。
第七章第四讲 变量的作用域和生存期
运行结果: 1: x=0 y=0 2: x=135 y=246 3: x=135 y=246
定义 次数: 只能1次 位置: 所有函数之外 分配内存: 分配内存,可初始化
说明 > 可说明多次 函数内或函数外 不分配内存,不可初始化
> >
若外部变量与局部变量同名,则外部变量被屏蔽
应尽量少使用全局变量,因为: 全局变量在程序全部执行过程中占用存储单元 降低了函数的通用性、可靠性,可移植性 降低程序清晰性,容易出错
printf("%d ",a[i]); printf("sub:a=%d,b=%d\n",a,b); printf("sub:a=%d,b=%d\n",a,b); printf("%d ",a[i]); } } } }
运行结果:5 4 3 2 1
全局变量---外部变量
定义:在函数外定义,可为本文件所有函数共用 有效范围:从定义变量的位置开始到本源文件结束,及有 extern说明的其它源文件 > 外部变量说明: extern 数据类型 变量表; > 外部变量定义与外部变量说明不同
运行结果: 3th x=5 2nd x=3 1st x=1
例 局部静态变量值具有可继承性
main() { void increment(void); increment(); increment(); increment(); } void increment(void) { int x=0; x++; printf(“%d\n”,x); }
15 10 0 8 b:-10
动态 存储区
例 用extern扩展外部变量作用域 main() { void gx(),gy(); extern int x,y; printf(“1: x=%d\ty=%d\n”,x,y); y=246; gx(); gy(); } void gx() { extern int x,y; x=135; printf(“2: x=%d\ty=%d\n”,x,y); } int x,y; void gy() { printf(“3: x=%d\ty=%d\n”,x,y); }
变量的作用域和生存期PPT课件
2.静态局部类型
定义局部变量时,使用Static修饰,可以在不改变局部变量的可见域的前提下, 使变量成为静态的,即当函数撤销后,变量的值还保留。或者说,这些变量的生存期 是永久的,只是在变量的作用域外是不可见的。这样,避免了全局变量的值可以被多 处修改将引起的副作用,又可以使函数基于前一次调用的值的基础上工作。
【例4-9】演示全局变量的作用域
• Int p=1,q=5; • Float f1(int a) •{ • int b,c; • ……. •} • Char c1,c2; • Char f2(int x,int y) •{ • int i,j; • ……. •} • Int main(void) •{ • Int m,n; • ……. •}
main( ) {int k=4,m=1,p;
p=func(k,m); printf(“%d,”,p); p=func(k,m); printf(“%d\n”,p);}
func(a,b) int a,b; {static int m=0,i=2; i+=m+1; m=i+a+b; return(m);}
4.5.2 C语言中变量的存储类型
根据变童的作用域将变量分为全局变量和局部变量,根据变量的生存期将变量分 为动态变量和静态变量。因此,C语言根据作用域和生存期将变量整合成四种存储类型。
(1)局部自动类型。在函数内部用标识符auto或register 声明。 (2)静态局部类型。在函数内部,使用Static声明。 (3)静态全局类型。在函数外部,使用Static。声明,也称为静态外部变量。 (4)全局类型。不需要标识符声明。在函数外部直接声明即可,通常称为外部变 量。
1. AUTO 存储类型和REGISTER 存储类型
变量间知识点总结
变量间知识点总结1. 变量的概念变量是程序中用于存储数据的一种元素,它是程序设计的基本构件之一。
在程序中,变量由一个标识符和一个类型组成,其用来存储特定类型的数据值。
变量的名字用来标识其中存储的数据,类型则用来描述变量可以存放的数据种类。
2. 变量的作用变量主要用来存储和处理程序中的数据。
通过定义不同的变量,程序可以在不同的地方使用这些数据,实现数据的传递和处理。
变量的作用包括存储数据、表示程序状态、在程序执行过程中改变值等。
二、变量的声明与赋值1. 变量声明在程序中,变量需要先声明后才能被使用。
声明变量就是告诉编译器或解释器,在程序中有一个特定类型的变量名为指定的标识符,其中存放着相应类型的数据。
变量的声明一般包括变量名和类型描述两部分,格式为“类型变量名;”2. 变量赋值变量赋值是指给变量赋予特定的值。
在程序执行过程中,变量的值是可以改变的。
变量赋值一般使用赋值操作符“=”进行,例如“变量名 = 值;”。
通过赋值操作,可以改变变量中存储的数据值,实现数据的更新和处理。
三、变量的命名规范1. 变量名的规则变量名是用来标识变量的标识符,它需要符合一定的命名规范。
变量名的规则一般包括以下几点:- 只能由数字、字母和下划线组成- 不能以数字开头- 区分大小写- 不能使用关键字- 不能使用特殊符号2. 变量名的命名规范变量名的命名规范主要包括以下几点:- 采用有意义的名字- 遵守驼峰命名法- 尽量简洁明了- 不要使用拼音- 不要使用特殊符号四、变量的数据类型1. 变量的数据类型变量的数据类型是指变量可以存储的数据种类。
常见的数据类型包括整型、浮点型、字符型、布尔型等。
不同的数据类型具有不同的取值范围和存储规则。
2. 基本数据类型在大多数编程语言中,基本的数据类型包括以下几种:- 整型:用来表示整数,如int、long等- 浮点型:用来表示小数,如float、double等- 字符型:用来表示字符,如char- 布尔型:用来表示真假,如bool3. 复合数据类型除了基本数据类型外,一些编程语言还提供了复合数据类型,如数组、结构体、指针等。
14变量作用域和生存期
2.
C语言中的两种存储类别:自动类和静态类。
局部变量可以说明成自动类,也可以说明成静态类;全局变量只能是静态类。
四个存储类别说明符:auto(自动) register(寄存器) static(静态) extern(外部)
使用格式: auto int x,y; int auto x,y; auto可以缺省
{ static int a;
n++ ; a++;
printf("%d\t%d\n",n,a);
}
main()
{ int i;
for(i=0;i<3;i++)
fun(i) ;
printf("\n");
}
3.
全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束为止。
void fun1(void);
void fun2(void);
int a;
涵盖整个源文件的所有函数
main()
{...a=a+...}
void fun1(void)
{...a=a+...}
int t; 从该位置以后的所有函数
内存的区域: 动态存储区(堆栈)、静态存储区、程序代码区;
(1)
auto变量的存储单元被分配在内存动态存储区。
每当执行流程进入函数体时都会为auto变量分配内存空间,并初始化,离开函数体时自动释放,因此,这类变量的作用域为定义的位置起到函数体结束为止或复合语句结束为止。
void sub(float a)
{ int i;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12
例 auto 变量的作用域
main() { int x=1;
void prt(void); { int x=3;
prt(); printf(“2nd x=%d\n”,x); } printf(“1st x=%d\n”,x); } void prt(void) { int x=5; printf(“3th x=%d\n”,x); }
z=x>y?x:y; return(z); } main() { extern int a,b; printf("max=%d",max(a,b)); } int a=13,b=-8;
运行结果:max=13
extern int a,b; int max() { int z;
z=a>b?a:b; return(z); } main() { printf("max=%d",max()); } int a=13,b=-8;
. . . }
file1.c
extern int global; static int number; func2() {.
else if(array[i]<min) min=array[i];
max
sum+=array[i]; }
min
return(sum/n);
作 用
}
域
main()
{ int i; float ave,score[10];
/*Input */
ave=average(score,10);
printf("max=%6.2f\nmin=%6.2f\n
640
main()
-------Main-----
{ static int a;
i:33 a:0 b:-10 c:8
register int b=-10;
-------Other-------
int c=0;
i:75 a:6 b:4 c:15 other: c
150
printf("-----MAIN------\n");
printf(“2: x=%d\ty=%d\n”,x,y);
}
int x,y;
void gy()
{ printf(“3: x=%d\ty=%d\n”,x,y);
} 2021/3/7
16
么么么么方面
§Sds绝对是假的
例 引用其它文件中的外部变量
int global; extern float x; main() { int local;
15
例 用extern扩展外部变量作用域
main()
{ void gx(),gy();
extern int x,y;
printf(“1: x=%d\ty=%d\n”,x,y);
y=246;
gx();
gy(); } void gx() { extern int x,y;
x=135;
运行结果:
1: x=0 y=0 2: x=135 y=246 3: x=135 y=246
外部变量可用存储类型:缺省 或 static 4
float max,min;
float average(float array[], int n)
{ int i; float sum=array[0];
max=min=array[0];
for(i=1;i<n;i++)
{ if(array[i]>max) max=array[i];
main() { void increment(void);
increment(); increment(); increment(); } void increment(void) { static int x=0; x++; printf(“%d\n”,x); }
运行结果:1 1 1
运行结果:1 2 3
} int f3() {….. } char c1,c2; char f2(int x,int y) { int i,j;
…… }
p,q的作用范围 c1,c2的作用范围
main()
{ int m,n;
…….
}
2021/3/7
6
例 外部变量定义与说明
int max(int x, int y) { int z;
}} } }
2021/3/7
运行结果:5 4 3 2 1 3
❖全局变量---外部变量
定义:在函数外定义,可为本文件所有函数共用
有效范围:从定义变量的位置开始到本源文件结束,及有
extern说明的其它源文件 > 外部变量说明: extern 数据类型 变量表; >
外部变量定义与外部变量说明不同
定义
说明
>
次数: 只能1次
可说明多次
位置: 所有函数之外
函数内或函数外
分配内存: 分配内存,可初始化 不分配内存,不可初始化
> 2021/3/7
若外部变量与局部变量同名,则外部变量被屏蔽 >
应尽量少使用全局变量,因为:
全局变量在程序全部执行过程中占用存储单元 >
降低了函数的通用性、可靠性,可移植性 降低程序清晰性,容易出错
2021/3/7
10
变量存储类型
局部变量
外部变量
存储类别 auto register 局部static 外部static 外部
存储方式
动态
静态
存储区 动态区 寄存器
静态存储区
生存期 函数调用开始至结束
程序整个运行期间
作用域 定义变量的函数或复合语句内 本文件 其它文件
赋初值 每次函数调用时
未赋初值
如: int sum; auto int a,b,c; register int i; static float x,y;
❖变量定义格式: [存储类型] 数据类型 变量表;
2021/3/7
2
例 例不同不函同数函中数同中名同变名量变量
局部变量与全局变量 mamina(i)n例() 复例合语复句合中语变句量中变量
average=%6.2f\n",max,min,ave);
2021/3/7
}
5
int p=1,q=5;
extern char c1,c2; float f1(int a)
{ int b,c;
扩 扩展 展后 后 c1,c2 c1,c2
的 的作 作用 用范 范围 围
extern char c1,c2; …….
2021/3/7
7
例 外部变量与局部变量
/*ch7_17.c*/ int a=3,b=5; max(int a, int b) { int c;
c=a>b?a:b; return(c); } main() { int a=8; printf("max=%d",max(a,b)); }
运行结果:max=8
main:c 80
printf("i:%d a:%d \ b:%d c:%d\n",i,a,b,c);
other()
register b:-10
{ static int a=2;
c=c+8;
static int b;
other();
int c=10;
printf("-----MAIN------\n"); a=a+2; i=i+32; c=c+5;
2021/3/7
8
例 外部变量副作用
int i; main() { void prt();
for(i=0;i<5;i++) prt();
} void prt() { for(i=0;i<5;i++)
printf(“%c”,’*’); printf(“\n”); }
运行结果:*****
2021/3/7
不确定
编译时赋初值,只赋一次 自动赋初值0或空字符
局部变量默认为auto型
register型变量个数受限,且不能为long, double, float型
局部static变量具有全局寿命和局部可见性
局部static变量具有可继承性
202e1/3x/7tern不是变量定义,可扩展外部变量作用域
11
例 文件file1.c
9
动态变量与静态变量
❖存储方式
静态存储:程序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间
❖内存用户区
❖生存期 程序区静态变量:从程序开始执行到程序结束
动态变量:从包含该变量定义的函数开始执行至函数执行结束
静态存储区
全局变量、局部静态变量
动态存储区
形参变量 局部动态变量(auto register) 函数调用现场保护和返回地址等
printf("i:%d a:%d \
printf("-----OTHER------\n");
b:%d c:%d\n",i,a,b,c);
printf("i:%d a:%d \
i=i+10;
b:%d c:%d\n",i,a,b,c);
other();
b=a;
} 2021/3/7
}
静态 存储区
动态 存储区
存储属性
存储器类型:寄存器、静态存储区、动态存储区
生存期:变量在某一时刻存在-------静态变量与动态变量
作用域:变量在某区域内有效-------局部变量与全局变量