精华内容
下载资源
问答
  • 普通局部变量分配在栈上,作用域为代码块作用域,生命周期是临时的,链接属性是无连接(编译时是一个函数形成一个单元,链接时是函数与函数之间的层次在交换,函数内部的局部变量与其他函数没有直接的联系,所以是无...

           普通局部变量分配在栈上,作用域为代码块作用域,生命周期是临时的,链接属性是无连接(编译时是一个函数形成一个单元,链接时是函数与函数之间的层次在交换,函数内部的局部变量与其他函数没有直接的联系,所以是无连接的)。  定义时未显式初始化其值是随机的(因为其分配在栈上,在栈上的内存其他变量用完时是不会清理内存的,所以通常说栈内存是脏的),变量地址由运行时在栈上分配得到的,多次执行时地址不一定相同(局部变量在分配空间时是哪里有位置就分配到哪里的,在函数结束时就会释放掉这块空间),函数不能返回局部变量的地址(指针)作为返回值(因为局部变量的地址时随机的,如果返回了该地址,其他函数访问该地址时,就不是该变量了)。

           静态局部变量分配在数据段/bss段(显式初始化为非0则在数据段,显式初始化为0或未显式初始化则在bss段),作用域为代码块作用域,生命周期为永久,链接属性为无连接,定义时如果未显式初始化默认为0,变量的地址由运行时环境在加载程序时确定,整个程序运行过程中唯一不变。数据段和bss段在本质上明显区别,是为了对内存进行优化。在对程序进行编译运行时,加载器会在全局变量里分配空间,只需要对数据段的变量和他的值挨个的拷贝,在bss段只要对其清零就可以。

           静态局部变量其实就是作用域为代码块作用域(链接属性为无连接)的全局变量。静态局部变量可以改为使用全局变量来实现,但是在程序中要尽量避免使用全局变量,太多全局变量的话会破坏程序的结构性。

           静态全局变量/静态函数和普通全局变量/普通变量的唯一差别时:static使全局变量/函数的链接属性由外部链接(整个程序所有文件范围)转为内部链接(仅当前c文件内)。这是为了解决全局变量/函数的重名问题(c语言没有命名空间namespace的概念,因此在程序中文件变多之后全局变量/函数的重名问题非常严重,将不必要被其他文件引用的全局变量/函数声明为static可以很大程度上改善重名问题,但是仍未彻底解决)。所以写程序要尽量避免使用全局变量。

           在编程时要注意区分全局变量的定义和声明。一般规律如下:如果定义的同时有初始化则一定会被认为时定义;如果只是定义而没有进行初始化则又可能被编译器认为时定义,也有可能被认为时声明,(如果在a.c和b.c出现了两个重名的全局变量但是都没有初始化,编译器不会报错,会默认为一个时定义一个时声明)要进行具体的分析。如果使用extern则肯定会被认为时声明(实际上extern也可以有定义,加上extern可以明确的告诉我们把这个变量变为外部链接的)。

           全局变量在定义应该在c文件中并且在头文件中声明,而不是定义在头文件中(如果定义在头文件中,则该头文件被多个c文件包含时该全局变量会重复定义),头文件中应该放一些类型定义、宏、函数声明这样的。 

           在b.c中引用a.c中定义的全局变量/函数有两种方法:一种是在a.h中声明该函数/全局变量,然后再b.c中#include “a.h”。二是再b.c中使用extern显式声明要引用的函数/全局变量

           根据上面的描述可以看出:存储类决定了变量的声明周期,作用域决定了链接属性。宏和inline函数的链接属性为无连接。

    展开全文
  • 在[color=#FF0000]一个解决方案[/color]下新建两个项目a、b,再添加一个头文件c.h,c中设置一个静态变量int m=0,a、b两个项目都去掉c中的静态m, 请问:当在a项目中赋值m=1时,b中的m是多少呀,是1还是0;也就是说...
  • 这两者的区别:非静态全局变量作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序...

    静态全局变量和非静态全局变量的区别

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

    展开全文
  • Java变量的作用域静态变量、全局变量和局部变量变量的作用域规定了变量所能使用的范围,只有在作用域范围内变量才能被使用。根据变量声明地点的不同,变量的作用域也不同。根据作用域的不同,一般将变量分为不同的...

    Java变量的作用域:静态变量、全局变量和局部变量

    变量的作用域规定了变量所能使用的范围,只有在作用域范围内变量才能被使用。根据变量声明地点的不同,变量的作用域也不同。

    根据作用域的不同,一般将变量分为不同的类型:成员变量和局部变量。下面对这几种变量进行详细说明。

    成员变量

    Java 的成员变量有两种,分别是全局变量和静态变量(类变量)。定义在方法体和语句块之外,不属于任何一个方法,作用域是整个类。

    名称

    修饰

    访问

    生命周期

    全局变量(实例变量)

    无 static 修饰

    对象名.变量名

    只要对象被当作引用,实例变量就将存在

    静态变量(类变量)

    用 static 修饰

    类名.变量名或对象名.变量名

    其生命周期取决于类的生命周期。类被垃圾回收机制彻底回收时才会被销毁

    假设在一个类中声明了 4 个变量,下面编写一个测试类输出引起变量的值改变的示例代码。

    变量声明代码如下所示:

    public class DataClass {

    String name; // 成员变量、实例变量

    int age; // 成员变量、实例变量

    static final String website = "xinbiancheng"; // 成员变量、静态变量(类变量)

    static String URL = "http://www.xinbiancheng.cn"; // 成员变量、静态变量(类变量)

    }

    测试类代码如下所示:

    public class Test {

    public static void main(String[] args) {

    // 创建类的对象

    DataClass dc = new DataClass();

    // 对象名.变量名调用实例变量(全局变量)

    System.out.println(dc.name);

    System.out.println(dc.age);

    // 对象名.变量名调用静态变量(类变量)

    System.out.println(dc.website);

    System.out.println(dc.URL);

    // 类名.变量名调用静态变量(类变量)

    System.out.println(DataClass.website);

    System.out.println(DataClass.URL);

    }

    }

    运行效果如下所示:

    null

    0

    xinbiancheng

    http://www.xinbiancheng.cn

    xinbiancheng

    http://www.xinbiancheng.cn

    本例的第一段代码中定义了 4 个成员变量,由输出结果可以看出,name 和 age 显示系统默认初始化的值,website 和 URL 显示初始化的值。

    且用 static final 修饰的变量必须赋予初始值。

    局部变量

    局部变量是指在方法或者方法代码块中定义的变量,其作用域是其所在的代码块。可分为以下三种:

    方法参数变量(形参):在整个方法内有效。

    方法局部变量(方法内定义): 从定义这个变量开始到方法结束这一段时间内有效。

    代码块局部变量(代码块内定义):从定义这个变量开始到代码块结束这一段时间内有效。

    局部变量在使用前必须被程序员主动初始化值。

    1)方法局部变量

    声明两个局部变量并输出其值,其实现代码如下:

    public class Test2 {

    public static void main(String[] args) {

    int a = 7;

    if (5 > 3) {

    int s = 3; // 声明一个 int 类型的局部变量

    System.out.println("s=" + s);

    System.out.println("a=" + a);

    }

    System.out.println("a=" + a);

    }

    }

    上述实例中定义了 a 和 s 两个局部变星,其中 int 类型的 a 的作用域是整个 main() 方法,而 int 类型的变量 s 的作用域是 if 语句的代码块内,其执行结果如下所示:

    s=3

    a=7

    a=7

    如果在 if 方法外调用变量 s,则会报无法解析该变量的错误。

    2)方法参数变量

    作为方法参数声明的变量的作用域是整个方法。

    声明一个方法参数变量,实现代码如下:

    public class Test3 {

    public static void testFun(int n) {

    System.out.println("n=" + n);

    }

    public static void main(String[] args) {

    testFun(3);

    }

    }

    上例定义了一个 testFun() 方法,testFun()方法中包含一个 int 类型的参数变量 n,其作用域是 testFun() 方法体内。当调用方法时传递进了一个参数 3,因此其输出控制台的 n 值是 3。

    3)代码块局部变量

    代码块局部变量常用于 try catch 代码块中,成为异常处理参数变量。

    异常处理参数变量的作用域是在异常处理块中,该变量是将异常处理参数传递给异常处理块,与方法参数变量类似。

    声明一个异常处理语句,实现代码如下:

    public class Test4 {

    public static void test() {

    try {

    System.out.println("Hello!Exception!");

    } catch (Exception e) { // 异常处理块,参数为 Exception 类型

    e.printStackTrace();

    }

    }

    public static void main(String[] args) {

    test();

    }

    }

    在上述实例中定义了异常处理语句,异常处理块 catch 的参数为 Exception 类型的变量 e,作用域是整个 catch

    展开全文
  • 1.两者作用域不同,全局变量的作用域是整个工程项目,静态全局变量作用域只在当前文件 2.全局变量在其他文件引用时,需使用extern声明 3.全局变量和静态全局变量都存储在静态存储区

    1.两者作用域不同,全局变量的作用域是整个工程项目,静态全局变量作用域只在当前文件

    2.全局变量在其他文件引用时,需使用extern声明

    3.全局变量和静态全局变量都存储在静态存储区

    4.全局变量和静态全局变量都是定义在函数外或类外

    展开全文
  • 局部变量,全局变量静态变量的作用域,生命期? C++变量根据定义位置的不同,具有不同的作用域作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。 从作用域看: 全局...
  • 全局变量具有全局作用域全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量静态局部变量具有局部作用域,它只被初始化...
  • 这两者的区别在于非静态全局变量作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同...
  • 全局变量静态变量的存储方式是一样的,只是作用域不同。如果它们未初始化或初始化为0则会存储在BSS段,如果初始化为非0值则会存储在DATA段,见进程的地址空间分配一文。 静态变量的作用域是当前源文件,全局变量的...
  • 2、作用域不同:非静态变量的作用域是整个源程序,即其他类调用到该类时,可以访问到非静态全局变量;而静态全局变量只能是在本类中可访问; 3、访问方式不同:静态变量可以通过类直接访问,非静态变量需要实例化一...
  • 局部变量:函数内部定义的...全局变量:函数之外定义的变量 int p=1,q=5; int fun(int r){ r=p+q; } 产生作用的范围在从定义位置开始到全部程序结束 最好写在#include 的后边 {  int b,c;  b=2;c=5;  int
  • 全局变量静态变量的存储方式是一样的,只是作用域不同。如果它们未初始化或初始化为0则会存储在BSS段,如果初始化为非0值则会存储在DATA段,见进程的地址空间分配一文。静态变量的作用域是当前源文件,全局变量的...
  • 全局变量、静态局部变量、局部变量、静态全局变量 全局变量 全局作用域 全局变量只需在一个源文件中定义,就可以作用于所有的源文件。其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局...
  • 全局变量和静态全局变量

    千次阅读 2019-04-15 00:01:34
    这两者在存储方式上并无不同,区别在于非静态全局变量作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的...
  • 文章转载至全局变量、局部变量、静态全局变量、静态局部变量的区别  C++变量根据定义位置的不同,具有不同的作用域作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。 ...
  • C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别 C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域作用域可分为 6 种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件...
  • 作用域:全局作用域全局变量只需在一个源文件中定义,就可以作用于所有的源文件。) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量。 内存分布:全局数据...
  • 1.之前我理解类是为了节省时间演化来的,因此里面的类的静态属性应该和模块中的全局变量作用范围类似,那类中的静态属性应该在整个类中都能访问。但实际为代码段所示。 2. ``` 2.1 全局变量能被内部定义函数所...
  • 1. 全局变量 全局变量存储在静态存储区,其作用域...静态全局变量存储在静态存储区,其作用域只能是定义该变量的文件,生命周期是整个程序的生命周期。 3. 静态局部变量 静态局部变量存储在静态存储区,作用域...
  • 变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态 存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个...
  • 原文链接:c语言局部变量 静态局部变量 全局变量与静态全局变量 - L的存在 - 博客园 https://www.cnblogs.com/lanjianhappy/p/6035433.html 基本概念: 作用域:起作用的区域,也就是可以工作的范围。 代码块:...
  • 全局变量、静态全局变量和静态局部变量都是静态持续变量,编译器...静态全局变量是用static修饰的全局变量,它的作用域是全局;静态局部变量是定义在代码块或函数内部的静态变量,它的作用域是代码块或函数内部。 i...
  • C++ 全局变量、静态全局变量、局部变量、静态局部变量的使用,整理表格如下:分类 全局变量 静态全局变量(static) 局部变量(auto) 静态局部变量(static) 作用域 全局作用域(extern) 文件作用域(当前文件) 局部作用域...
  • 静态全局变量 - 全局作用域+文件作用域,所以无法在其他文件中使用。如果俩个文件定义了相同名字的静态局部变量,那他们是俩个不同的变量,而非一个。 局部变量 - 局部作用域,比如函数的参数,函数内的局部变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,702
精华内容 1,480
关键字:

静态全局变量作用域