CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?

楼主soarhigh(翔)2002-10-31 12:54:58 在 C/C++ / C语言 提问

thank   u 问题点数:100、回复次数:21Top

1 楼topikachu(皮皮)回复于 2002-10-31 13:13:58 得分 10

不在函数里的变量就是全局变量  
  如果是在同一个cpp文件里,编译器自然知道什么在函数里,什么在函数外面  
  如果是在其他cpp文件定义的,那么你要用extern声明,告诉编译器这个变量是全局的,但是不在这个文件里.否则会遇到"未声明标识符"错误  
  操作系统不管你的变量.事实上,它连变量的名字都不会知道:),它只是按照编译好的代码,一步步的执行Top

2 楼ToUpdate(老六)回复于 2002-10-31 13:23:54 得分 0

UP!  
  Top

3 楼arcsiny(诺亚方舟)回复于 2002-10-31 14:22:35 得分 0

能用局部就不要用全局  
  编译起来没有效率  
  Top

4 楼jlqidan(jlqidan)回复于 2002-10-31 14:49:03 得分 0

还有,关于变量作用域的问题就是,在函数里有与全局变量同名的局部变量,则在此函数范围内局部变量覆盖全局变量。  
  使用全局变量不是个好办法,c#把一切都封装进类,已经没有全局变量的概念了Top

5 楼ywchen2000(灌水大帝:努力奋斗)回复于 2002-10-31 16:59:36 得分 0

通过{},如果在大括号外,就不是全局变量Top

6 楼cwanter(亚玛逊河上的渔夫)回复于 2002-10-31 17:03:11 得分 20

全局变量和局部变量的区别主要在于生存周期不同,全局变量在整个程序生成期间可见,局部变量在自己的作用域内可见。全局变量的内存分配是静态的,位于PE文件在数据区,在main()前由C、C++运行期函数初始化,如果没有初值,会被初始化为0。局部变量的内存分配是动态的,位于线程堆栈中。如果没有初始化的,初值视当前内存内的值而定。Top

7 楼IEQQ(从小事做起)回复于 2002-10-31 19:18:07 得分 0

小菜的论述比较全面哦。  
   
    稍稍补充,全局变量在程序运行期间长驻内存,直到程序运行结束,  
   
    局部变量   动态分配内存,  
   
    尽量少用全局变量Top

8 楼JanePeter(光光)回复于 2002-10-31 20:09:05 得分 20

1生存周期不同  
  2   作用范围不同  
  3       分配方式不同  
  4           安全感不同  
  5               用途不同!  
  Top

9 楼datougui(一个梦)回复于 2002-11-01 00:10:27 得分 0

局部变量,是具有块作用域的。如果把数据存储在局部变量里,函数在不同的块之间只能通过参数传递来共享数据。Top

10 楼ckacka(/*小红帽*/ckacka();)回复于 2002-11-01 00:17:47 得分 0

cwanter(小菜)说得很好!Top

11 楼x2jack(捷可)回复于 2002-11-01 00:35:31 得分 20

全局变量和局部变量的作用域不同,在函数中出现变量名同全局变量同名时以函数中的变量作为操作数,当函数返回时,函数中的变量即结束了生存期,变量值为全局变量的值。编译器是以栈结构保存信息以实现的。  
  int   i=5;  
  main()  
  {    
    printf("%d\n",i);  
    add()  
    printf("%d\n",i);  
  }  
  void   add()  
  {   int   i=10;  
    printf("%d\n",i);  
  }  
  结果:  
  5  
  10  
  5  
  Top

12 楼GOTO_2002(mmmttt)回复于 2002-11-01 00:43:38 得分 10

全局变量和局部变量的区别方法就是他们的作用域不同。在同一作用域中如果两个变量的名字相同,遵循低作用域覆盖高作用域的原则。例如:  
   
  int   a;  
  class   c  
  {  
              private:  
                              int   a;  
              public:  
                              void   b();  
  }  
  c::b()  
  {  
  int   a;  
  a=15;         //这里的a就是b()中声明的a;  
  c::a=15;     //这里的a是class   c声明的a;  
  ::a=15;     //这里的a是全局变量a;  
  }  
   
  操作系统只管执行机器指令,把内存某个地址(存放变量a)推进区某个值,然后进行运算。Top

13 楼zhiqiu(http://www.bsdlover.cn(找兼职,谁有需求?))回复于 2002-11-01 08:08:31 得分 0

同意   cwanter(小菜)Top

14 楼rivershan(阿门)回复于 2002-11-01 08:55:40 得分 10

一个声明由四个部分组成:一个可选的描述符,一个基础类型,一个声明符,和一个可选的初始式。局部变量的作用域从它声明的那一点开始,直到这个声明所在的块结束为止。全局变量的作用域从它声明的那一点开始,一直到这个声明所在的文件的结束。一个块里声明的名字可以遮蔽在其外围的块里所声明的名字或者全局的名字。被遮蔽的全局名字可以通过作用域解析运算符::去引用。没有办法使用被遮蔽的局部名字。一个名字的作用域从它被声明的那点开始,初始式开始之前。函数参数被当作函数最外层的块中的声明。Top

15 楼shitalone(西特龙)回复于 2002-11-01 09:31:25 得分 0

同意小菜!没什么好说的了Top

16 楼ElleLang(风笛)回复于 2002-11-01 12:32:49 得分 0

那如果局部变量是静态的呢?Top

17 楼hehe214(风之子)回复于 2002-11-01 12:56:05 得分 0

xuexiTop

18 楼Bandry(菜鸟-舍我其谁)回复于 2002-11-01 13:05:02 得分 10

全局变量是在所有函数之外声明的变量,局部变量则是在函数体内声明的变量。全局变量放在内存的全程数据区,局部变量在栈上申请。全局数据区分为两部分全局数据区和静态数据区,静态数据区专门存放static变量。static的全局变量只在该文件范围内可见,不能用extern声明为外部变量。  
  编译器会自动初始化全局变量。Top

19 楼xdspower(杂食菜熊)回复于 2002-11-01 15:19:34 得分 0

那如果局部变量是静态的呢  
   
  局部静态变量在定义模块之外是不可见的(理论上——有特殊方法可见——传出变量的指针,这在有的编译器中要出警告或错误)  
  Top

20 楼ElleLang(风笛)回复于 2002-11-01 16:08:41 得分 0

局部静态变量的作用域好理解,生命周期能说得详细点吗?还有内存分配方式。Top

21 楼GOTO_2002(mmmttt)回复于 2002-11-01 16:45:01 得分 0

学习ing~~~~Top

相关问题

  • 全局变量和静态局部变量有什么区别?
  • 局部变量和全局变量的问题
  • windows server 2003+ vc 6.0 vs 局部变量和全局变量
  • 】】】全局变量与局部变量的疑惑!!!【【【
  • 关于全局变量,main()中局部变量与函数参数的问题
  • 如何在函数中访问被局部变量覆盖的全局变量
  • 关于全局变量和局部变量初试值的问题
  • 关于局部变量!!!
  • 局部变量与栈
  • 全局变量、静态变量、局部变量各存在内存的什么区域呀

关键词

  • 函数
  • 编译器
  • 内存
  • 操作系统
  • 文件
  • 变量
  • 局部变量
  • 全局
  • 作用域
  • 数据区

得分解答快速导航

  • 帖主:soarhigh
  • topikachu
  • cwanter
  • JanePeter
  • x2jack
  • GOTO_2002
  • rivershan
  • Bandry

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo