Chinaunix首页 | 论坛 | 博客
  • 博客访问: 766224
  • 博文数量: 274
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 862
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-24 15:31
个人简介

不合格的程序猿

文章分类

全部博文(274)

文章存档

2019年(3)

2018年(1)

2017年(4)

2016年(160)

2015年(106)

我的朋友

分类: C/C++

2016-01-21 15:08:39

局部变量

func()

{

int a;

int b=0;

}

很多书籍中也叫自动变量,它声明在函数块内,作用范围也在函数块内。 不能被同一源文件的其他函数使用,也不能被其他文件中的函数使用。

局部变量存储在栈中。无论局部变量显示初始化(如b),或者未初始化(如a),都只有当定义它们的程序块被调用时(即执行时),才分配空间,声明或定义时并不分配,局部变量不是可执行模块的一部分!!除非显示地对局部变量进行初始化,否则,它们的初始值是不确定的。

全局变量

int a;

int b=0;

func()

{

}

全局变量没有声明在任何一个函数内,作用范围在程序运行始终存在。

能被同一源文件的任何函数使用,也能被其他文件中的函数使用,但要使用extern关键字。

全局变量存储在数据段中。全局变量显示初始化时(如b),或者未初始化时(如a),在程序映像中有不同的分区:已初始化的全局变量是可执行模块的一部分。未初始化的全局变量则不是可执行模块的一部分,只有当定义它们的程序被调用时(即执行时),才分配空间,声明或定义时并不分配。未初始化的全局变量在运行时被初始化为0。

静态变量

用static关键字定义的变量,与局部变量相比, static局部变量有三点不同:
1. 存储空间分配不同
auto类型分配在栈上,属于动态存储类别,占动态存储区空间,函数调用结束后自动释放, 而static分配在静态存储区,在程序整个运行期间都不释放,两者之间的作用域相同,但生存期不同。
2. static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次。
3. 对于局部静态变量,如果不赋初值,编译期会自动赋初值0或空字符,而auto类型的初值是不确定的。(对于C++中的class对象例外, class的对象实例如果不初始化, 则会自动调用默认构造函数, 不管是否是static类型)

静态全局变量用来表示不能被其它文件访问的全局变量和函数。为了限制全局变量/函数的作用域,函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意:对于外部(全局)变量,不论是否有static限制,它的存储区域都是在静态存储区,生存期都是全局的。此时的static只是起作用域限制作用,限定作用域在本模块(文件)内部。

静态全局变量与全局变量的差别是:静态全局变量只能被同一源文件中的函数调用,其他文件中的函数不能调用静态全局变量。

主存中的程序映像布局

高端地址(小地址)| 命令行参数和环境变量|    <--argc、argv、环境

                  |    栈    | <--函数调用的活动记录(返回地址参数,已保存的寄存器,局部变量)

                  |  .........  |

                  |      堆     |    <--用malloc函数族分配的内存

                  | 未初始化的全局变量 |

                  | 已初始化的全局变量 |

低端地址(大地址)|      程序文本      |

static   是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从   static   修饰符的产生原因、作用谈起,全面分析static   修饰符的实质。    
   
  static   的两大作用:    
   
  一、控制存储方式:    
   
    static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。    
   
    1、引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题:   如果想将函数中此变量的值保存至下一次调用时,如何实现?    
  最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。    
   
    2、   解决方案:因此c++   中引入了static,用它来修饰变量,它能够指示编译器将此变量在程序的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。    
   
  二、控制可见性与连接类型   :    
   
    static还有一个作用,它会把变量的可见范围限制在编译单元中,使它成为一个内部连接,这时,它的反义词为”extern”.    
   
    static作用分析总结:static总是使得变量或对象的存储形式变成静态存储,连接方式变成内部连接,对于局部变量(已经是内部连接了),它仅改变其存储方式;对于全局变量(已经是静态存储了),它仅改变其连接类型。    
   
  类中的static成员:    
   
  一、出现原因及作用:    
   
    1、需要在一个类的各个对象间交互,即需要一个数据对象为整个类而非某个对象服务。    
   
    2、同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。    
   
    类的static成员满足了上述的要求,因为它具有如下特征:有独立的存储区,属于整个类。    
   
  二、注意:    
   
    1、对于静态的数据成员,连接器会保证它拥有一个单一的外部定义。静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。   
   
    2、类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。    
 extern  
    声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。  
   
    在C++中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前Microsoft   C/C++仅支持”C”转换标记,来支持C编译器链接。使用这种情况有两种形式:  
   
               extern   “C”   声明语句  
   
               extern   “C”   {   声明语句块   }

转载:

       http://hi.baidu.com/swinggucas/blog/item/7d8e1b95273d6e17d31b70df.html

      

阅读(860) | 评论(0) | 转发(0) |
0

上一篇:ldd命令的介绍

下一篇:Linux下安装openldap

给主人留下些什么吧!~~