局部变量和全局变量

局部变量和全局变量
局部变量和全局变量

8.8 局部变量和全局变量

8.8.1 局部变量

局部变量:函数或分程序内定义的变量,只在本函数或本分程序内有效。

说明:(1)我们使用的变量一般是局部变量,main函数中的变量也是局部变量。

(2)不同函数可以使用相同的变量名,但他们是互不关联的两个变量

(3)形参是局部变量

(4)复合语句中的变量局部于本复合语句(分程序)

8.8.2 全局变量

全局变量:在函数(所有函数)之外定义的变量,作用于其后的所有函数,叫做全局变量。

作用域(有效范围):定义变量的位置到本文件结束。

局部变量与全局变量尤如地方法规与全国法规。

说明

(1)优点:增加了函数的联系渠道,带回多于一个返回值。部分的节省了内存和执行时间。

(2)缺点:始终占用内存。降低了函数的独立性。降低了函数的可靠性和通用性。

模块化程序设计有一个原则:模块的“内聚性”强,与其他模块的“耦合性”小。

内聚性即模块内部的内在完整性,独立性,功能的单一性,封闭性。

耦合性:模块之间的互相影响,函数与数据的相关性。耦合性小,不确定因素就少。

习惯上我们把函数做成“黑箱”,只关心入口(形参和实参结合)和出口参数(函数值)及其函数功能,不关心模块(函数)内部的细节。这样,程序的可移植性好,可读性好。

全局变量的值不好控制,过多的使用全局变量会极大的降低程序的可读性

因此我们应尽量不使用全局变量

全局变量举例:使用软件的单位名,年,月,日

提倡:全局变量的第一个字母为大写。

(3)外部变量的屏蔽

li8_16.c 程序分析的方法

8.9 变量的存储类别

8.9.1 动态存储方式与静态存储方式

作用域:空间

生存期:时间

存储区分类:程序区、静态存储区、动态存储区

全局变量全部存放在静态存储区,程序开始执行时分配存储区,程序运行期间占据固定的存储空间,程序执行完毕后释放掉。

动态存储方式:在程序运行期间根据需要进行动态的分配存储空间,函数调用开始时动态分配存储区,函数结束时释放这些空间。形参、自动变量(无static 声明的局部变量)存放在动态存储区、函数调用时的现场保护和返回地址等也存放在动态存储区(堆栈)。

同一函数两次调用时局部变量占据的存储空间地址可能不同。被调用函数局部变量的生存期并不等于整个程序的生存期。

变量和函数有两个属性:数据类型、数据的存储类别。

存储类别:数据在内存中存储的方法:静态存储类、动态存储类。根据存储类别决定变量的作用域和生存期。

8.9.2 auto变量

auto变量:无static声明的局部变量。

用auto作存储类别的声明时,可以不写auto,存储类别隐含确定为auto(自动存储类别)。是动态存储方式。大多数变量是自动变量。

8.9.3 用static声明局部变量

用static声明的局部变量是静态局部变量。

函数调用结束后静态局部变量占据的内存存储单元空间不释放,局部变量保留原值,下次调用时可以继续使用该值。

li8_17.c

说明:

(1)静态局部变量属于静态存储类别,在静态存储区分配内存单元,在整个程序运行期间都不释放。

使用静态局部变量的值

(2)静态局部变量的初值:编译时赋初值,只赋初值一次,调用时已经有初值,调用时是不赋初值的。

(3)若定义时未赋初值,则初始化为0或'\0'(全0)

(4)静态局部变量中“局部”的含义:只有本函数可以使用,其他函数无法使用该变量。

用途:

(1)需要保留函数上一次调用的某些结果时,这些值可定义为静态变量。

li8_18.c 阶乘

(2)某些变量初始化后只被引用而不改变其值时,可定义为静态变量。

(3)静态变量多占内存,降低可读性,没有必要时不要使用静态变量。

常见用法:统计某一个函数被调用的次数,或者与调用次数相关的其他统计工作。

函数调试的方法:

1 监控函数的参数值

2 加断点

8.9.4 register 变量

省去了内存与CPU的数据交换过程,直接使用CPU的内部寄存器。

li8_19.c

说明:(1)只有局部变量和形参可以作为register变量,全局变量不行。

(2)80x86系列CPU最多可使用的register变量数目有限。int型可使用8个通用寄存器。

实际上有些系统并不把register变量存放在寄存器中,而优化的编译系统则可以自动识别使用频繁的变量而把他们放在寄存器中,因此用register声明变量实际上是不必要的。我们只需要知道有这么一种变量即可。

(3)静态变量不能定义为register。

8.9.5 用extern声明外部变量

外部变量即全局变量

可以用extern声明来改变全局变量的作用域

1. 在一个文件内声明外部变量

一般将外部变量声明放在引用它的函数之前,也可以将外部变量定义放在引用它的函数之前。

li8_20.c

外部变量声明时可以不指定类型。

2. 在多文件的程序中声明外部变量

在一个文件中引用另一个文件中定义的外部变量时,应用extern声明该变量,且用#include将该文件包含进来。

li8_21.c

8.9.6 用static声明外部变量

静态外部变量:只能用于本文件的外部变量(全局变量)

static改变了外部变量的作用范围

8.9.7 关于变量的声明和定义

函数的声明与定义:定义是一个模块,而声明放在声明部分是一个说明;

对于变量:定义性声明需要建立存储空间和初始化,即定义,定义只能有一次。引用性声明:已经在别处定义过了,做一个提前使用的说明,可以多次说明。对于外部变量,extern只用于声明,不用于定义。

用static声明局部变量,是做静态分配。

用static声明全局变量,是限定全局变量的作用域。

auto、register、static只能在定义时使用。

8.9.8 存储类别小结

对一个数据的定义包括两个属性,数据类型和存储类别。

1 作用域:

局部变量:自动变量、静态变量、(寄存器变量)、形式参数。

全局变量:静态外部变量、外部变量

2 生存期:

动态存储:自动变量、(寄存器变量)、形式参数

静态存储:静态变量、全局变量、静态外部变量

3 存储位置

静态存储区:静态变量、静态外部变量、全局变量

动态存储区:自动变量、形式参数

4 作用域和生存期的比较page181

作用域又称为变量的“可见性”

生存期表示变量是否存在

静态变量的作用域和生存期是不同的。

5 static的含义对于局部变量和全局变量是不同的,相同的是限制了作用域。不同的是局部变量原来是动态存储,而全局变量本来就是静态存储。

变量的深入探讨与内存的使用是密切相关的

8.10 内部函数和外部函数

函数本质上是全局的,但可以限定函数能否被别的文件所引用。

8.10.1 内部函数

只能被本文件的其他函数所调用的函数称为内部函数。

在定义时用static加以说明

又称为静态函数

8.10.2 外部函数

可以被其他文件调用的函数称为外部函数,一个函数如果不加说明时是外部函数

外部函数可用extern加以说明,也可以不说明。

li8_22.c

在调用别的文件的外部函数时,应用extern声明,但是可以省略extern关键字。

即函数原型可以拓宽函数的作用域。

#include 预处理命令使用户可以免写库函数原型。

8.11 如何运行一个多文件的程序

1 TC的项目文件 .prj

将多个.c文件的文件名排列起来,保存为.prj,编译连接即可

2 MS-C的link命令

3 用#include,后边的文件被插入到第一个文件之前,extern声明可以省略。习题

xt8.1 xt8.3 xt8.4 xt8.9 xt8.11 xt8.14 xt8.15 xt8.17 xt8.18

算法总结

例8.6 例8.8 例8.9 例8.14 例8.16 例8.17 例8.22

小结

1 函数概念:具有一定功能一定形式的程序单位。

2 一般将输入和输出放在main()函数中,程序主体另外定义为函数

3 函数定义与函数原型

4 值传递和址传递

5 参数传递和“哑实结合”,一一对应

6 函数返回值及类型

7 递归调用的特点

9 数组做实参与址传递

10 全局变量

11 静态变量与初始化

运行到a=5时:

运行到

局部变量全局变量静态局部变量静态全局变量的异同

局部变量、全局变量、静态局部变量、静态全局变量的异同 2011-01-18 10:16 完成内容: 1.收获备忘; 2.局部变量、全局变量、静态局部变量、静态全局变量的异同; 3.设计函数atoi()(字符串转int型) 4.含参数的宏与函数的优缺点; 一.收获备忘 1.数组名指向的是一块内存块,内存的地址与大小在生命期内不可改变,只有内存块中的内容可以改变;指针可以随时指向任意类型的内存块; 2.strcpy()函数的原型:char *strcpy(char *strDestination, const char *strSource); malloc()函数的原型:void *malloc(size_t size); free()函数的原型:void free(void *memblock); 3.指针在free()或delete后,需重新指向NULL,或指向合法的内存; 4.申请动态内存后,应该马上判断是否申请成功(malloc和new 申请动态内存不成功返回NULL),若申请不成功,则用exit(1)强制退出程序; 5.内存分配的三种方式: (1).从静态存储区域分配:变量在编译时已经分配好,在整个程序运行期间都存在,例如:全局变量,静态全局变量; (2).从“栈”上分配:函数内的局部变量,在使用时自动从栈上创建内存区域,函数结束时自动释放。由于栈上内存的分配运算内置于处理器的指令集中,使用效率很高,但容量有限; (3).从“堆”上分配:即动态内存分配,程序员可使用malloc ()/new申请任意大小的动态内存空间,同时由程序员决定何时使用free ()/delete去释放已申请的内存。使用起来十分灵活,但最容易出问题;

全局变量和局部变量

全局变量与局部变量的区别 2009-11-15 10:12 一、变量的分类变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。 全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。静态全局变量,只本文件可以用。 全局变量是没有定义存储类型的外部变量,其作用域是从定义点到程序结束.省略了存储类型符,系统将默认为是自动型. 静态全局变量是定义存储类型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的.只有程序运行结束后,才释放所占用的内存. 自动型变量存放在堆栈区中.堆栈区也是内存中一部分,该部分内存在程序运行中是重复使用的. 二、介绍变量的作用域 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。 一、局部变量 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。 例如: int f1(int a) /*函数f1*/ { int b,c; …… }a,b,c作用域

SQL中的全局变量和局部变量.

SQL中的全局变量和局部变量 在SQL中,我们常常使用临时表来存储临时结果,对于结果是一个集合的情况,这种方法非常实用,但当结果仅仅是一个数据或者是几个数据时,还要去建一个表,显得就比较麻烦,另外,当一个SQL语句中的某些元素经常变化时,比如选择条件,(至少我想)应该使用局部变量。当然MS SQL Server的全局变量也很有用。 >>>>局部变量 声明:DECLARE @local_variable data_type @local_variable 是变量的名称。变量名必须以 at 符 (@) 开头。data_type 是任何由系统提供的或用户定义的数据类型。变量不能是 text、ntext 或 image 数据类型。 示例: use master declare @SEL_TYPE char(2) declare @SEL_CUNT numeric(10) set @SEL_TYPE = 'U'/*user table*/ set @SEL_CUNT = 10 /*返回系统中用户表的数目*/ select @SEL_CUNT = COUNT(*) from sysobjects where type = @SEL_TYPE select @SEL_CUNT as 'User table ''s count' 如果要返回系统表的数目,可以用set @SEL_TYPE = 'S' 可能这个例子并不能说明使用变量的好处,我只是想说明使用方法。当一组(几个甚至几十个)SQL语句都使用某个变量时,就能体会到他的好处了。 >>>>全局变量 全局变量是系统预定义的,返回一些系统信息,全局变量以两个at(@)开头。下面是我统计了一些较为常用的变量。 @@CONNECTIONS 返回自上次启动以来连接或试图连接的次数。 @@CURSOR_ROWS 返回连接上最后打开的游标中当前存在的合格行的数量(返回被打开的游标中还未被读取的有效数据行的行数)

C、C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别

C、C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别 static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 面向过程设计中的static 全局变量、局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 从作用域看: 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。 局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。 静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。 从分配内存空间看: 全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。 Tips: A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

局部变量、全局变量、堆、堆栈、静态和全局

局部变量、全局变量、堆、堆栈、静态和全局【】 预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 ?栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。 其操作方式类似于数据结构中的栈。 ?堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 ?全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。- 程序结束后有系统释放 ?文字常量区—常量字符串就是放在这里的。程序结束后由系统释放 ?程序代码区—存放函数体的二进制代码。 一个正常的程序在内存中通常分为程序段、数据端、堆栈三部分。程序段里放着程序的机器码、只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。 在内存中,它们的位置如下: +------------------+ 内存低端 | 程序段| |------------------| | 数据段| |------------------| | 堆栈| +------------------+ 内存高端 堆栈是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出。它支持两个操作,PUSH和POP。PUSH是将数据放到栈的顶端,POP是将栈顶的数据取出。 在高级语言中,程序函数调用、函数中的临时变量都用到堆栈。为什么呢?因为在调

CC++中的静态全局变量,静态局部变量,全局变量,局部变量的区别

C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区 别 static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 面向过程设计中的static 全局变量、局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 从作用域看: 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。 局部变量也只有局部作用域,它是自动对象(auto),它在程序运行

期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。 静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。 从分配内存空间看: 全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一

全局变量和静态局部变量有什么区别

全局变量和静态局部变量有什么区别? 存储的地方是一样的,不同之处在于它们的作用域不同: 全局变量基本上在程序的任何地方都能被看到 而静态局部变量只能在其指定的范围内被使用 比如 int i ; // 全局变量 class C { public: static int i_C; // 静态局部变量 } void main() { i = 1; // 合法 i_C = 1; // 错误 C::i_C = 1; // 合法 C cc; cc.i_C = 2; // 合法 } 2、 全局变量具有外部连接性,即同一工程中其它文件中的也可引用。 而静态变量不具有外部连接性,即同一工程中其它文件中不可以引用。如: //cpp1.cpp extern int x=10; static int y=5; //cpp2.cpp #include void main() { extern int x; extern int y; cout<

将这两个文件放在同一工程中,你发现每一文件单独编译能通过,但作为工程不能构成.exe 文件运行。若将有关变量y的行注释后(或将static换成extern)就可以了。这是因为静态变量的作用域在本文件内,不能扩充到其它文件。其作用是当多人合作开发一个工程时,仅在自己的文件内使用的全局变量用静态变量不会与其他人用的变量相混淆,这就是标识符的一致性。 3、静态局部变量 在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其初始化为0。 静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作的运行结果也不同。

局部变量和全局变量

8.8 局部变量和全局变量 8.8.1 局部变量 局部变量:函数或分程序内定义的变量,只在本函数或本分程序内有效。 说明:(1)我们使用的变量一般是局部变量,main函数中的变量也是局部变量。 (2)不同函数可以使用相同的变量名,但他们是互不关联的两个变量 (3)形参是局部变量 (4)复合语句中的变量局部于本复合语句(分程序) 8.8.2 全局变量 全局变量:在函数(所有函数)之外定义的变量,作用于其后的所有函数,叫做全局变量。 作用域(有效范围):定义变量的位置到本文件结束。 局部变量与全局变量尤如地方法规与全国法规。 说明 (1)优点:增加了函数的联系渠道,带回多于一个返回值。部分的节省了内存和执行时间。 (2)缺点:始终占用内存。降低了函数的独立性。降低了函数的可靠性和通用性。 模块化程序设计有一个原则:模块的“内聚性”强,与其他模块的“耦合性”小。 内聚性即模块内部的内在完整性,独立性,功能的单一性,封闭性。 耦合性:模块之间的互相影响,函数与数据的相关性。耦合性小,不确定因素就少。 习惯上我们把函数做成“黑箱”,只关心入口(形参和实参结合)和出口参数(函数值)及其函数功能,不关心模块(函数)内部的细节。这样,程序的可移植性好,可读性好。 全局变量的值不好控制,过多的使用全局变量会极大的降低程序的可读性

因此我们应尽量不使用全局变量 全局变量举例:使用软件的单位名,年,月,日 提倡:全局变量的第一个字母为大写。 (3)外部变量的屏蔽 li8_16.c 程序分析的方法 8.9 变量的存储类别 8.9.1 动态存储方式与静态存储方式 作用域:空间 生存期:时间 存储区分类:程序区、静态存储区、动态存储区 全局变量全部存放在静态存储区,程序开始执行时分配存储区,程序运行期间占据固定的存储空间,程序执行完毕后释放掉。 动态存储方式:在程序运行期间根据需要进行动态的分配存储空间,函数调用开始时动态分配存储区,函数结束时释放这些空间。形参、自动变量(无static 声明的局部变量)存放在动态存储区、函数调用时的现场保护和返回地址等也存放在动态存储区(堆栈)。 同一函数两次调用时局部变量占据的存储空间地址可能不同。被调用函数局部变量的生存期并不等于整个程序的生存期。 变量和函数有两个属性:数据类型、数据的存储类别。 存储类别:数据在内存中存储的方法:静态存储类、动态存储类。根据存储类别决定变量的作用域和生存期。 8.9.2 auto变量 auto变量:无static声明的局部变量。 用auto作存储类别的声明时,可以不写auto,存储类别隐含确定为auto(自动存储类别)。是动态存储方式。大多数变量是自动变量。

C语言中全局变量,局部变量,静态全局变量,静态局部变量的区别

C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 从作用域看: 1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。 3>局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。 4>静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static 关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。 2.从分配内存空间看: 1>全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间 2>全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。2)变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

静态变量,全局变量,局部变量的区别

静态变量,全局变量,局部变量的区别 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 从作用域看: 1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。 2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。 3>局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。 4>静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static 关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。 2.从分配内存空间看: 1>全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间 2>全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。 Tips: A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;

全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别

一、程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放 4、文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放。 5、程序代码区 — 存放函数体的二进制代码。 二、例子程序 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b;// 栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; 123456\0";//在常量区,p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 } 三、从作用域看: 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再

labVIEW中局部变量与全局变量

很多教科书上都提示要慎用局部变量和全局变量,主要有以下几个原因: 违背了数据流的编程 读取局部变量需要拷贝数据 不能象SUBVI一样可以重用数据BUFFER 不利于程序调试 容易引起竞争 我在论坛上看到很多初学者的程序,里面充满了大量的局部变量,可以这样说,当你使用了过多的局部变量的时候,你的程序结构是有问题的,在早期的LV版本中根本不存在全局变量和局部变量,同样可以编制规模很大的程序,这说明局部变量和全局变量并不是必须的,LV提供了它们是因为在特定的情况下可以简化编程。 当我们使用SUBVI时,我们需要定义一个连接器,包括输入输出端子,调用VI的数据从输入端子进入,当SUBVI未执行完毕时,数据是不会流出到输出端子的,因此,SUBVI 可以重用调用VI的数据缓冲区。而局部变量可以在子VI的任何位置被读写,局部变量在同一一个VI中,全局变量可以在任何VI中,所以通常情况下,无法重用数据缓冲区。 局部变量用于读写一个VI的前面板对象,对象是控制器或者指示器都可以,当我们读局部变量的时候,我们是在对象的当前状态,而对象在程序框图中的其它位置,其它的线程可能连续写这个对象,所以LABVIEW无法重用内存,不得不拷贝数据到新的缓冲区中,如果数据结构很大,就会占用相当多的内存。 很多情况下,局部变量都是可以避免的,看下面的例子。 上面图中的设计方式,在很多初学的程序中经常碰到,同样的数据要传到两个VI中,并且有次序要求,因此采用了顺序结构。问题是根本没有必要用局部变量,局部变量导致了数据的复制。

上面的两个图完成同样的功能,一个仍然采用顺序结构,不过CLUSTER挪到了FRAME 外面,通过隧道,将数据传入到两个子VI中,避免了使用局部变量。但是顺序结构本身也是效率比较低的,也是NI不建议过度使用的. 针对这个具体问题,最下面的是最好地解决方案,利用错误簇作为数据流实现了顺序处理,避免使用局部变量。通过错误簇同时也有利于程序调试跟踪.另外一个明显的优点是程序框图更清晰明了,避免了在各个FRAME中进行切换. 全局变量使用内存的方式类似于局部变量,不同的是每次读全局变量肯定要生成一份内存拷贝,而局部变量是有可能重用缓冲区的.当全局变量是一个比较大的数组或者字符串时,多处多次读操作会造成大量的内存复制,极大地占用内存,导致运行速度下降。 从使用方法的角度看,全局变量很向一个SUBVI(8。X后SUBVI也有了使用权限的问题,如私有,公有),可以被任何其它VI调用,但是有一个根本的不同,当一个SUBVI正在被其他VI调用的时候,另外一个VI如果也在调用这个SUBVI,它必须等待这个SUBVI 执行完成后,(设置可重入的除外),因此,尽管LABVIEW是并行的,多线程的,但是具体到这个SUBVI,却是有顺序的,需要控制权的,因此,LABVIEW很容易对SUBVI 进行缓存重用。 所以,对全局变量,尤其是针对数组或者字符串,尽管它可以直接被调用,最好也要封装成一个SUBVI来使用,这样可以极大提高内存使用效率,同时避免了竞争的问题。 在循环中调用全局变量尤其要注意,每次多全局变量的时候,LV必须先复制这个数据,看下面的例子

全局变量、局部变量、静态全局变量、静态局部变量的区别

全局变量、局部变量、静态全局变量、静态局部变量的区别 118848 0500 20 0OTHER 15 013 868 00 0星级BLOG 0gyan#FFFFFF#187218 no-repeat _blank 144143 02010-09-13 21:33:41 144141 02010-09-13 21:33:31"20100913","20100915","20100916","20100918","20100921","20100925"," 20100926","20101012","20101013",""2353730 144143 2010-10-13 21:47:37 2010-10-13 21:47:37 10 0\r\n 全局变量、局部变量、静态全局变量、静态局部变量的区别 \r\n C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 \r\n 从作用域看: \r\n 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。 \r\n 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。 \r\n

局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不 是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量 被撤销,其所占用的内存也被收回。 \r\n 静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含 多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定 义了相同名字的静态全局变量,它们也是不同的变量。 \r\n 从分配内存空间看: 全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局 部变量在栈里分配空间 \r\n \r\n \r\n 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域 是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个 源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量 的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变 量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避 免在其它源文件中引起错误。 \r\n 1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量 和堆变量的区别。

1、局部变量能否和全局变量重名

1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C 文件中对此变量赋初值,此时连接不会出错。 4、语句for( ;1 ;)有什么问题?它是什么意思? 答:无限循环,和while(1)相同。 5、do……while和while……do有什么区别? 答:前一个循环一遍再判断,后一个判断以后再循环。 6、请写出下列代码的输出内容 #i nclude main() { int a,b,c,d; a=10; b=a++; c=++a; d=10*a++; printf("b,c,d:%d,%d,%d",b,c,d); return 0; } 答:10,12,120 1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

局部变量与全局变量区别,栈、堆和静态存储区的区别

C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。 从作用域看: 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全 局变量定义的源文件需要用extern关键字再次声明这个全局变量。 静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和 全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。 局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数 的一次调用结束后,变量就被撤销,其所占用的内存也被收回。 静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相 同的静态全局变量,他们也是不同的变量。 从分配内存空间看: 全局变量、静态局部变量、静态全局变量都在静态存储区分配空间,而局部变量在栈分配空间。 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上没有什么不同。区别 在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件 中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文 件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免 在其他源文件中引起错误。 1、静态变量会被放在程序的静态数据存储区里,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是 他与堆栈变量和堆变量的区别 2、变量用static告知编译器,自己仅仅在变量的作用域范围内可见。这一点是他与全局变量的区别。 从以上分析可以看出,把局部变量改变为静态变量后是改变了他的存储方式,即改变了他的生存期。把全局变量改 变为静态变量后是改变了他的作用域,限制了他的使用范围,因此static这个说明符在不同的地方起的作用是不同的。 TIPS: 1、若全局变量仅在单个文件中访问,则可以讲这个变量修改为静态全局变量。 2、若全局变量仅在单个函数中使用,则可以将这个变量修改为该函数的静态局部变量。 3、全局变量、静态局部变量、静态全局变量都存放在静态数据存储区。

4.11C 局部变量和全局变量

在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。同样,在复合语句中定义的变量只在本复合语句范围内有效。这称为局部变量(local variable)。如: 对局部变量的一些说明: 1)主函数main中定义的变量(m,n)也只在主函数中有效,不会因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。 2)不同函数中可以使用同名的变量,它们代表不同的对象,互不干扰。例如,在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c,它们在内存中占不同的单元,不

3)可以在一个函数内的复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为分程序或程序块。 4)形式参数也是局部变量。例如f1函数中的形参a也只在f1函数中有效。其他函数不能调用。 5)在函数声明中出现的参数名,其作用范围只在本行的括号内。实际上,编译系统对函数声明中的变量名是忽略的,即使在调用函数时也没有为它们分配存储单元。例如: int max(int a,int b);//函数声明中出现a、b int max(int x,int y)//函数定义,形参是x、y { cout<

C语言 全局变量和局部变量的大小限制(堆栈区别)

#include int main(){ int a[1000000];//局部变量 return 0; } 编译运行后发现溢出错误。 #include int a[1000000];//全局变量 int main(){ return 0; } 编译运行后正常。 在解释原因前我们先看一下一个由C/C++编译的程序占用的内存分为几个部分: 1、栈区(stack segment):由编译器自动分配释放,存放函数的参数的值,局部变量的值等。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 2、堆区(heap segment):一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收。它与数据结构中的堆是两回事。堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 3、全局区(静态区)(data segment):全局变量和静态变量的存储区域是在一起的,程序结束后由系统释放。数据区的大小由系统限定,一般很大。 4、文字常量区:常量字符串就是放在这里的,程序结束后由系统释放。 5、程序代码区:存放函数体的二进制代码。 综上所述,局部变量空间是很小的,我们开一个a[1000000]就会导致栈溢出;而全局变量空间在Win 32bit 下可以达到4GB,因此不会溢出。

重要c语言全局变量和局部变量问题汇总

c语言全局变量和局部变量问题汇总 1、关键字static的作用是什么? 定义静态变量 2、static有什么用途?(请至少说明两种) 网上答案: 1).限制变量的作用域(在程序的整个运行期间都不释放) 2).设置变量的存储域(存储在静态存储区内) 谭浩强C语言page180: (1)对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在;(2)全局变量用static声明,则该变量的作用域只限于本文件模块 谭浩强C语言page182的说明将以上两种答案联系在一起,有助于理解static的作用:static对于局部变量和全局变量的作用不同。 对局部变量来说,它是变量由动态存储方式改变为静态存储方式。对于全局变量来说,它使变量局部化(局部于本文件),但仍为静态存储方式。 从作用于角度看,凡是static声明的,其作用域都是有限的,静态局部变量局限于本函数内,静态外部变量局限于本文件内。 3、全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态存储区,局部变量在堆栈。 华为: 4、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。 对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而局部变量的作用域就在定义的循环体内。 5、如何引用一个已经定义过的全局变量?关键字extern的使用说明 答:用关键字extern作外部变量声明 (1) 用extern可以在一个文件内声明外部变量(谭浩强CPage176) (2) 也可以在多文件的程序中声明外部变量。(谭浩强CPage177) 网上的答案是:可以用引用头文件的方式,但是对于这个说法,笔者之前试着用过,记得是不可以,在不同的源文件中包含这个头文件时,在程序连接时会出现重复定义multiple public definitions的错误,而在不同的源文件中使用这个变量时,也会出现multiple public definitions的错误,所以笔者没有使用这种方法,而是使用关键字extern 网上的另一个答案是:也可以用extern关键字,也就是在其中一个源文件中定义外部变量,而在另外使用该变量的源文件开始的位置将这个变量用关键字extern声明。 网上:如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 6、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

局部变量和全局变量.字符串处理函数

#include int a=3; main() { int s=0; {int a=5;s+=a++;} s+=a++; printf("%d\n",s); } 8 2. #include int x=3; incre() { static int x=1; x*=x+1; printf("%d",x); } main() { int i; for (i=1;i #include main() { char a[]={'a','b','c','d','e','f','g','h','\0'}; int i,j; i=sizeof(a); j=strlen(a); printf("%d,%d\n",i,j); } 9,8

2. #include #include main() { char a[7]="a0\0a0\0";int i,j; i=sizeof(a); j=strlen(a); printf("%d %d\n",i,j); } 7 2 3. 程序运行后,输入ABC<回车>,将输出___ #include "stdio.h" #include "string.h" main() { char ss[10]="12345"; gets(ss);strcat(ss,"6789");printf("%s\n",ss); } ABC6789 4. #include #include main() { char *p[10]={"abc","aabdfg","dcdbe","abbd","cd"}; printf("%d\n",strlen(p[4])); } 2 1. #include main() { char str[]="xyz",*ps=str; while(*ps) ps++; for(ps--;ps-str>=0;ps--) puts(ps); } z

相关文档
最新文档