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

时间:2022-10-25 15:28:27
都存放在全局数据区,好像作用是一样的?高手请详细说明!最好有举几个例子!
谢谢

13 个解决方案

#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


静态局部变量是包含她的函数已运行变占用内存的。

费静态则只有再分配时才占用内存

#3


全局的,在mian与WinMain进入点之前startup码帮助初始化。
局部的,在声明处初始化。

#4


全局变量是在它定义以后的代码都可以访问它。
静态变量是只有在定义该变量的模块中才能访问它。

#5


程序需要遵守两种规则: 操作系统规则(可访问地址空间,内存映像和读写权限,内存操作原则)和编译器强加给源程序的规则(语法,如变量的生存期,可见性等);静态变量和全局变量都是放在全局数据区里的,没错,但这是运行时,你说的是内存映像,在编译时他们是有区别的不是吗,他们的作用域明显不同!

要指出的是操作系统规则和编译器规则是很不相同的,虽然两者有一定联系。

#6


全局变量具有外部连接性,即同一工程中其它文件中的也可引用。
而静态变量不具有外部连接性,即同一工程中其它文件中不可以引用。
如:
//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)就可以了。这是因为静态变量的作用域在本文件内,不能扩充到其它文件。其作用是当多人合作开发一个工程时,仅在自己的文件内使用的全局变量用静态变量不会与其他人用的变量相混淆,这就是标识符的一致性。

#7


虽然全局变量和静态局部变量都是以静态存储方式存储的,但全局变量的作用域是从定义开始到文件结束,在作用域内的所有函数都是可见的,也就是说对作用域内的所有函数都可以使用,而静态局部变量虽然也是以静态存储方式存储,但它的作用域只限定于定义的函数,对其它函数来说是不可见的,因而也不能使用

#8


简单的理解是:
全局变量即在定义后在本文件编写中任何地方都可以调用。
而静态变量只在本模块编写中可以调用。

#9


作用域不同

#10


都是在类外部定义的。但STATIC是在类内部声明的。

#11


变量可以分为全局变量、静态全局变量、静态局部变量和局部变量
按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区
按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。
代码如下:
//test.cpp
#include <iostream.h>
extern int a;//变量声明,不是定义
static int b=5;
void func1()
{
  cout<<b<<endl<<a<<endl;//结果为5
}

//main.cpp
int a;
int b=10;
void func2()
{
  static int i;
  i++;
  cout<<i<<endl;
}

void func1();

void main()
{
  a=20;
  func1();
  func2();
  func2();
}
输出结果为
5
20
1
2

#12


作用域不同啊!
全局变量的比局部静态的范围大。

#13


我看了一下觉得wlz47的程序有错误。啊明的也是。
问题大家说的以很清楚了。我就不说了。在下同意“文”的帖子!

#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


静态局部变量是包含她的函数已运行变占用内存的。

费静态则只有再分配时才占用内存

#3


全局的,在mian与WinMain进入点之前startup码帮助初始化。
局部的,在声明处初始化。

#4


全局变量是在它定义以后的代码都可以访问它。
静态变量是只有在定义该变量的模块中才能访问它。

#5


程序需要遵守两种规则: 操作系统规则(可访问地址空间,内存映像和读写权限,内存操作原则)和编译器强加给源程序的规则(语法,如变量的生存期,可见性等);静态变量和全局变量都是放在全局数据区里的,没错,但这是运行时,你说的是内存映像,在编译时他们是有区别的不是吗,他们的作用域明显不同!

要指出的是操作系统规则和编译器规则是很不相同的,虽然两者有一定联系。

#6


全局变量具有外部连接性,即同一工程中其它文件中的也可引用。
而静态变量不具有外部连接性,即同一工程中其它文件中不可以引用。
如:
//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)就可以了。这是因为静态变量的作用域在本文件内,不能扩充到其它文件。其作用是当多人合作开发一个工程时,仅在自己的文件内使用的全局变量用静态变量不会与其他人用的变量相混淆,这就是标识符的一致性。

#7


虽然全局变量和静态局部变量都是以静态存储方式存储的,但全局变量的作用域是从定义开始到文件结束,在作用域内的所有函数都是可见的,也就是说对作用域内的所有函数都可以使用,而静态局部变量虽然也是以静态存储方式存储,但它的作用域只限定于定义的函数,对其它函数来说是不可见的,因而也不能使用

#8


简单的理解是:
全局变量即在定义后在本文件编写中任何地方都可以调用。
而静态变量只在本模块编写中可以调用。

#9


作用域不同

#10


都是在类外部定义的。但STATIC是在类内部声明的。

#11


变量可以分为全局变量、静态全局变量、静态局部变量和局部变量
按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区
按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。
代码如下:
//test.cpp
#include <iostream.h>
extern int a;//变量声明,不是定义
static int b=5;
void func1()
{
  cout<<b<<endl<<a<<endl;//结果为5
}

//main.cpp
int a;
int b=10;
void func2()
{
  static int i;
  i++;
  cout<<i<<endl;
}

void func1();

void main()
{
  a=20;
  func1();
  func2();
  func2();
}
输出结果为
5
20
1
2

#12


作用域不同啊!
全局变量的比局部静态的范围大。

#13


我看了一下觉得wlz47的程序有错误。啊明的也是。
问题大家说的以很清楚了。我就不说了。在下同意“文”的帖子!