static与全局与局部变量的区别

转自:http://www.cnblogs.com/lzjsky/archive/2010/11/19/1882064.html

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
  从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。

  static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

  static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
  static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
  static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

  程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。

extern全局变量、static全局变量和static局部变量的生存期都是“永久”,区别只是可见域不同。extern全局变量可见区域是工程,static全局变量可见区域是文件,而static局部变量的可见区域是块。

从代码维护角度来看,对extern变量的修改可能会影响所有代码,对static全局变量的修改可能影响一个文件中的代码,而对static变量的修改
可能影响一个块的代码;因此在选择变量类型时,优先级是static局部>static全局>extern全局。但它们有着共同的缺点:使用
了这些类型变量的函数将是不可重入的,不是线程安全的。在C/C++标准库中有很多函数都使用了static局部变量,目前的实现中都为它们提供了两套代
码,单线程版本使用static变量而多线程版本使用“线程全局变量”,比如rand,strtok等。

一个进程可用内存空间为4G,可分在存放静态数据,代码,系统内存,堆,栈等。.活动记录一般存放调用参数、返回地址等内容。堆和栈最大的区别在于
堆是由低地址向高地址分配内存,而栈是由高向低。全局和静态数据存放在全局数据区,其余的在栈中,用malloc 或 new
分配的内存位于堆中。一般来说栈在低地址,堆位于高地址

时间: 2024-10-07 17:29:22

static与全局与局部变量的区别的相关文章

java之static变量与全局、局部变量的区别

static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上并无不同.这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的.而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函

Java——全局变量与局部变量的区别

在Java程序中,会根据变量的有效范围将变量分为成员变量和局部变量,通常类的属性成为累的全局变量(成员变量),成员变量在整个类中都有效,在类的方法体中定义的变量称为局部变量,局部变量只在当前代码体中有效不能用于类的其他方法中.成员变量可与局部变量的名字相同,此时成员变量将被隐藏,即这个成员变量在此方法中暂时失效,只取局部变量的值.举个例子: 1 public class Man{ 2 static int age=20; 3 public static void main(String[] ar

C++中的全局变量、普通局部变量和静态局部变量的区别

在C++中,我们经常难以说清楚全局变量.局部变量和静态局部变量的区别.本博客从变量存储特性和标识符作用域两个角度区分这三个变量. 首先,我们来看看C++程序的内存区域是如何分配的. 从上图,我们可以看到,C++程序的内存区域分为代码区.全局数据区.堆区和栈区.其中,全局变量和静态局部变量存放在全局数据区,这两个变量在程序开始时就已经分配和初始化存储空间了.而普通局部变量存放在栈区,它在程序进入声明的代码块时生成,在结束代码块时删除. 其次,从标识符作用域的角度,我们可以认为: 1. 全局变量和静

4.5 成员变量和局部变量的区别

/* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存 C:生命周期不同 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 D:初始化值不同 成员变量:有默认初始化值 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用. 注意事项: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则

Python中的全局变量与局部变量的区别

全局变量与局部变量两者的本质区别就是在于作用域 用通俗的话来理解的话, 全局变量是在整个py文件中声明,全局范围内都可以访问 局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了 如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的.因此不建议这样使用,这样会使得程序很不健全 直接来看几个例子来理解全局变量和局部变量的区别吧: Demo1: def fun(x):       y=2       print("乘法

成员变量和局部变量的区别(个人心得体会)

1:成员变量和局部变量的区别? 1.源代码中定义的位置不同     成员变量定义在类中.     局部变量定义在方法中(类的下一级大括号都是局部的),也可以定义局部变量. 2.内存中存储的位置不同     成员变量存储在堆内存的对象中.     局部变量存储在栈内存的方法中. 3.生命周期的不同     成员变量随着对象的调用而楚翔.     局部变量所属区间的运行而出现,随着所属区间的结束而结束.      2:     class car{       int num;       Stri

6_面向对象基础、成员变量和局部变量的区别

一.面向对象的思想 面向对象特点:(1)更符合我们思想习惯的思想:        (2)可以将复杂的事情简单化:        (3)将我们从执行者变成了指挥者,角色发生了转换. 二.类与对象及其应用 1.事物和类的对应关系   事物      类   属性  ----------成员变量   行为  ----------成员方法 2.成员变量和成员方法   成员变量:和以前定义变量一样,存储位置放生了改变,在类中方法外   成员方法:和以前定义方法一样,只不过去掉了static. 3.类与对象

VC和gcc在保证函数static变量线程安全性上的区别

VC和gcc不同,不能保证静态变量的线程安全性.这就给我们的程序带来了很大的安全隐患和诸多不便.这一点应该引起我们的重视!尤其是在构造函数耗时比较长的时候,很可能给程序带来意想不到的结果.本文从测试代码开始,逐步分析原理,最后给出解决方案. 多线程状态下,VC不能保证在使用函数的静态变量的时候,它的构造函数已经被执行完毕,下面是一段测试代码: class TestStatic { public: TestStatic() { Sleep(1000*10); m_num = 999; } publ

成员变量、类变量、局部变量的区别

一:成员变量和局部变量的区别 1.范围: 员变量定义在类中,在整个类中都可以被访问. 局部变量定义在局部范围内,如:函数内,语句内等. 2.存储: 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中. 局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放. 3.默认值: 成员变量有默认初始化值: 局部变量没有默认初始化值 . 二:成员变量和静态变量的区别: 1.成员变量存在于堆内存中. 静态变量存在于方法区中. 2.成员变量所属于对象.所以也称为实例变量. 静态变