road420

导航

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿(2)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜

关于局部与全局及静态的关系

1.在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,在此函数外面是不能使用这个变量,称之为 "局部变量"。形式参数也属于局部变量。在函数中的一个程序块(如某个复合语句{...})定义的局部变量只在这个程序块中有效,出了程序块后就无效。
2.有时希望函数中的局部变量的值在函数调用之后不消失而保留原值,在下一次该函数调用时该变量已有值,这时就该制定该局部变量为"静态局部变量",用static加以说明。
3.在函数之外定义的变量称之为全局变量,全局变量可以为本文件中其他函数所共用,其有效范围为:从定义变量开始到本源文件结束。如果在定义点之前的函数想应用该全局变量,则应该在该函数中使用关键字 extern作外部变量说明,表示该变量在函数外部定义在函数内部可以使用它。如果在同一个源文件中,全局变量和局部变量同名,则在局部变量作用范围内,全局变量不起作用。如果在其它文件中要引用该文件的全局变量,则需要在应用它的文件中,用extern作说明。
4.所谓静态全局变量,就是希望某些全局变量只限定于被本文件引用,而不被其它文件引用,这时可以在定义全局变量的时候在前面加一个static说明,

 5 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
  6 按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
  7 全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。
8 举个例子:
int a;  /*全局*/
static int b;  /*静态全局*/
int main()
{
}
这段代码如果是写在file.c里面的,那么file2.c就不能调用b;
但是file2.c中可以通过声明外部变量extent a;
9.静态全局变量
  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它
的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。
10 代码
//test.cpp
#i nclude <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

posted on 2006-09-10 12:11 深邃者 阅读(370) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理