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

合集下载

C语言之静态变量

C语言之静态变量

C语⾔之静态变量1、静态局部变量 有时候,我们希望函数中局部变量的值在函数调⽤结束之后不会消失,⽽仍然保留其原值。

即它所占⽤的存储单元不释放,在下⼀次调⽤该函数时,其局部变量的值仍然存在,也就是上⼀次函数调⽤结束时的值。

这时候,我们就应该将该局部变量⽤关键字 static 声明为“静态局部变量”。

当将局部变量声明为静态局部变量的时候,也就改变了局部变量的存储位置,即从原来的栈中存放改为静态存储区存放。

这让它看起来很像全局变量,其实静态局部变量与全局变量的主要区别就在于可见性,静态局部变量只在其被声明的代码块中是可见的。

对某些必须在调⽤之间保持局部变量的值的⼦程序⽽⾔,静态局部变量是特别重要的。

如果没有静态局部变量,则必须在这类函数中使⽤全局变量,由此也就打开了引⼊副作⽤的⼤门。

使⽤静态局部变量最好的⽰例就是实现统计次数的功能, 静态局部变量在内定义,但不象普通的那样,当来调⽤时就存在,退出时就消失。

静态始终存在着,也就是说它的为整个。

静态局部变量的虽然为整个,但是其仍与普通的相同,即只能在定义该变量的源内使⽤该变量。

退出该函数后,尽管该变量还继续存在,但不能使⽤它。

对基本类型的静态若在说明时未赋以初值,则系统⾃动赋予0值。

⽽对不赋初值,则其值是不定的。

根据静态的特点,可以看出它是⼀种为整个源⽂件的量。

虽然离开定义它的百函数后不能使⽤,但如再次调⽤定义它的函数时,它⼜可继续使⽤,⽽且保存了前次被调⽤后留下的值。

因此,当多次调⽤⼀个函数且要求在调⽤之间保留某些变量的值时,可考虑采⽤静态局部变量。

虽然⽤全局变量也可以达到上述⽬的,但全局变量有时会造成意外的副作⽤(尤其是短名全局变量的变量名污染很严重),因此仍以采⽤局部为宜。

简单的说静态局部变量与全局变量最明显的区别就在于:全局变量在其定义后所有函数都能⽤,但是静度态局部变量只能在⼀个函数⾥⾯⽤。

2、静态全局变量 在 C 语⾔中,static 关键字不仅可以⽤来修饰变量,还可以⽤来修饰函数。

static全局变量与普通的全局变量有什么区别

static全局变量与普通的全局变量有什么区别

(1)用于全局变量:外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。

(2)用于局部变量:局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。

(3)用于函数:内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。

Static全局变量与普通的全局变量有什么区别:1.static全局变量只初使化一次,防止在其他文件单元中被引用;2.static局部变量只被初始化一次,下一次依据上一次结果值;3.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝const关键字在C语言中用于声明”只读变量”,其值不可修改,但具有确定的数据类型。

C 编译器总是为其分配相应的存储单元。

在C++中,const关键字用于声明常量,C++编译器视具体情况决定是为其分配存储单元还是仅将其作为编译期间的常量。

在C++中,还可以修饰类的成员函数,不改变类中的数据成员.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *pASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。

如果表达式不为0,则继续执行后面的语句。

这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了就终止程序以免导致严重后果,同时也便于查找错误。

例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:const作用:修饰变量、修饰函数参数、修饰函数返回值三个作用。

被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

1)const变量有数据类型,而宏常量没有数据类型。

static全局变量与普通的全局变量的区别详细解析

static全局变量与普通的全局变量的区别详细解析

static全局变量与普通的全局变量的区别详细解析(1)static全局变量与普通的全局变量有什么区别?(2)static局部变量和普通局部变量有什么区别?(3)static函数与普通函数作⽤域有什么不同?(4)static函数与普通函数有什么区别?(1)static全局变量与普通的全局变量有什么区别?全局变量的说明之前再加以static 就构成了静态的全局变量。

全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。

这两者在存储⽅式上并⽆不同。

这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。

⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。

由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。

从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储⽅式即改变了它的⽣存期。

把全局变量改变为静态变量后是改变了它的作⽤域,限制了它的使⽤范围。

(2)static局部变量和普通局部变量有什么区别?static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;(3)static函数与普通函数作⽤域有什么不同点?仅在本⽂件。

只在当前源⽂件中使⽤的函数应该说明为内部函数(static),内部函数应该在当前源⽂件中说明和定义。

对于可在当前源⽂件以外使⽤的函数,应该在⼀个头⽂件中说明,要使⽤这些函数的源⽂件要包含这个头⽂件。

(4)static函数与普通函数有什么区别?static函数在内存中只有⼀份,普通函数在每个被调⽤中维持⼀份拷贝程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。

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

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

For personal use only in study and research; not for commercial use静态变量,全局变量,局部变量的区别1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

从作用域看:1>全局变量具有全局作用域。

全局变量只需在一个源文件中定义,就可以作用于所有的源文件。

当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

3>局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

4>静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static 关键字修饰过的变量具有文件作用域。

这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

2.从分配内存空间看:1>全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间2>全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。

这两者在存储方式上并无不同。

这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。

而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。

由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

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

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

局部变量、全局变量、堆、堆栈、静态和全局【】预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分∙栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。

其操作方式类似于数据结构中的栈。

∙堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。

注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

∙全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。

- 程序结束后有系统释放∙文字常量区—常量字符串就是放在这里的。

程序结束后由系统释放∙程序代码区—存放函数体的二进制代码。

一个正常的程序在内存中通常分为程序段、数据端、堆栈三部分。

程序段里放着程序的机器码、只读数据,这个段通常是只读,对它的写操作是非法的。

数据段放的是程序中的静态数据。

动态数据则通过堆栈来存放。

在内存中,它们的位置如下:+------------------+ 内存低端| 程序段||------------------|| 数据段||------------------|| 堆栈|+------------------+ 内存高端堆栈是内存中的一个连续的块。

一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。

堆栈的底部是一个固定地址。

堆栈有一个特点就是,后进先出。

也就是说,后放入的数据第一个取出。

它支持两个操作,PUSH和POP。

PUSH是将数据放到栈的顶端,POP是将栈顶的数据取出。

在高级语言中,程序函数调用、函数中的临时变量都用到堆栈。

为什么呢?因为在调用一个函数时,我们需要对当前的操作进行保护,也为了函数执行后,程序可以正确的找到地方继续执行,所以参数的传递和返回值也用到了堆栈。

通常对局部变量的引用是通过给出它们对SP的偏移量来实现的。

另外还有一个基址指针(FP,在Intel芯片中是BP),许多编译器实际上是用它来引用本地变量和参数的。

static变量和static函数的各自的特点

static变量和static函数的各自的特点

static变量和static函数的各自的特点static变量大致分为三种用法一、用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.二、用于全局变量,主要作用是限制此全局变量被其他的文件调用.三、用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象static 声明的变量在C语言中有两方面的特征:1、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。

这一点是它与堆栈变量和堆变量的区别。

2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。

这一点是它与全局变量的区别。

Tips:A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static 变量(这样的函数被称为:带“内部存储器”功能的的函数)E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

函数前加static使得函数成为静态函数。

但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。

使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。

随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。

为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。

全局变量、局部变量与静态变量

全局变量、局部变量与静态变量

全局变量、局部变量和静态变量区别变量是程序运行时在内存中所申请的存储单元,根据所要存储的数据大小,申请的内存单元数量是不同的。

当某个程序加载后,会在内存中占据三个区域,分别为代码段、堆栈段和数据段。

代码段用于存放程序的所有指令;堆栈段用于存放临时数据;而数据段则用于存放长期数据。

堆栈段和数据段都是用于存放数据的,也就是可以用于定义变量。

堆栈段存放的是临时数据,主要用于函数调用时的参数传递、寄存器保存以及局部变量的保存。

某个变量存放在其中的位置不确定,跟堆栈的使用情况有关,所有的非静态局部变量都是定义在堆栈段中。

由于每次进入函数时堆栈的使用情况不同,为某个局部变量所申请的内存单元位置是不同的。

例如:某程序有一个名为abc的函数,其中包含一个unsigned char类型的局部变量x。

当第一次调用abc函数时,堆栈的栈顶位置是1000(表示堆栈中还有1000个单元没有被使用),则x存放在堆栈内偏移地址为999单元中,当执行完abc后,堆栈的栈顶又恢复到之前的位置。

当第二次调用abc函数时,栈顶的位置可能不再是1000,存放x的单元也不再是上次的999号单元,原来存放在999号单元的内容与本次的x没有任何关系。

一句话,局部变量之所以不能将数据保留下来,就是因为其所申请的内存单元不是固定的位置。

而全局变量以及函数内部的静态变量,则是申请在数据段。

数据段在程序加载到内存后,就为每个全局变量和静态变量申请了固定的位置,一直到该程序结束之前,这些全局变量和静态变量所占据的位置都是固定的,它们的内容也就没有保留下来。

全局变量与静态变量都是占据固定位置,内容可以保留。

区别在于:程序的所有函数都可以访问全局变量,而只能定义某个静态变量的函数可以访问该静态变量,其它函数不能访问它。

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

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

全局变量、局部变量、静态全局变量、静态局部变量的区别⼀、C++变量根据定义的位置的不同的⽣命周期,具有不同的作⽤域,作⽤域可分为6种:全局作⽤域,局部作⽤域,语句作⽤域,类作⽤域,命名空间作⽤域和⽂件作⽤域。

(1)从作⽤域看:1、全局变量具有全局作⽤域。

全局变量只需在⼀个源⽂件中定义,就可以作⽤于所有的源⽂件。

当然,其他不包含全局变量定义的源⽂件需要⽤extern 关键字再次声明这个全局变量。

2、静态局部变量具有局部作⽤域,它只被初始化⼀次,⾃从第⼀次被初始化直到程序运⾏结束都⼀直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,⽽静态局部变量只对定义⾃⼰的函数体始终可见。

3、局部变量也只有局部作⽤域,它是⾃动对象(auto),它在程序运⾏期间不是⼀直存在,⽽是只在函数执⾏期间存在,函数的⼀次调⽤执⾏结束后,变量被撤销,其所占⽤的内存也被收回。

4、静态全局变量也具有全局作⽤域,它与全局变量的区别在于如果程序包含多个⽂件的话,它作⽤于定义它的⽂件⾥,不能作⽤到其它⽂件⾥,即被static关键字修饰过的变量具有⽂件作⽤域。

这样即使两个不同的源⽂件都定义了相同名字的静态全局变量,它们也是不同的变量。

(2)从分配内存空间看:1、全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,⽽局部变量在栈⾥分配空间2、全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。

这两者在存储⽅式上并⽆不同。

这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。

⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。

由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。

1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下⼀次调⽤的时候还可以保持原来的赋值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

全局变量和静态局部变量有什么区别?
存储的地方是一样的,不同之处在于它们的作用域不同:
全局变量基本上在程序的任何地方都能被看到
而静态局部变量只能在其指定的范围内被使用
比如
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 <iostream.h>
void main()
{
extern int x;
extern int y;
cout<<x<<endl;
cout<<y<<endl;
}
将这两个文件放在同一工程中,你发现每一文件单独编译能通过,但作为工程不能构成.exe 文件运行。

若将有关变量y的行注释后(或将static换成extern)就可以了。

这是因为静态变量的作用域在本文件内,不能扩充到其它文件。

其作用是当多人合作开发一个工程时,仅在自己的文件内使用的全局变量用静态变量不会与其他人用的变量相混淆,这就是标识符的一致性。

3、静态局部变量
在局部变量前加上“static”关键字,就成了静态局部变量。

静态局部变量存放在内存的全局数据区。

函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间。

它始终驻留在全局数据区,直到程序运行结束。

静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其初始化为0。

静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。

静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作的运行结果也不同。

以下无正文
仅供个人用于学习、研究;不得用于商业用途。

For personal use only in study and research; not for commercial use.
仅供个人用于学习、研究;不得用于商业用途。

Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden.
Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.
仅供个人用于学习、研究;不得用于商业用途。

толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.
For personal use only in study and research; not for commercial use。

相关文档
最新文档