Chinaunix首页 | 论坛 | 博客
  • 博客访问: 168033
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 903
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-11 15:05
个人简介

Never say die!

文章分类

全部博文(31)

文章存档

2014年(31)

分类: C/C++

2014-05-14 18:29:47

目录:

1、变量存储类型

特别注意: 1)局部变量默认是自动auto存储,可以省略不写;

          2)register寄存器存储,速度很快,目前用的不多;

          3)static位于静态存储区,既可以声明局部变量也可以声明全局变量,如果声明的全局变量只能作用与本文件,这也是static的好处,可以避免一些全局变量不被其它文件使用,但可以被本文件的其他函数使用;另外static声明的变量空间自动赋初值0,但对于自动存储类型声明变量如果没有初始化值,则会被系统任意给一个随机值;

局部变量:也即是在函数内定义的变量,每次函数调用时赋初值,调用后释放;

全局变量:也即是在函数外定义的变量,只是在编译时赋值,只赋值一次,不会被释放,也即值有延续性;

总结

a) static既可以声明全局变量也可以声明局部变量,都存储在静态存储区

b) 在函数体定义的一个变量(局部变量),该局部变量分配到栈内存,调用函数体结束后,系统就    会收回栈内存,则该局部变量相应失效,也即被丢弃掉;

但有时候我们需要在两次调用之间对变量的值进行保存,通常的想法是定义一个全局变量来实    现。但这个变量已经是局部变量,若让其具有全局变量特性,就需要借助static;

c) static声明的静态局部变量保存在全局数据区,而不是栈中,每次的值保持到下次的值调用,作   为其下次的初值;

4)extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见。

   用其声明该变量或函数在别的源文件已经定义过。

   eg:  extern int a;

 仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间变量a在所有模块中作为一  种全局变量只能被定义一次,否则会出现连接错误,多为重定义错误;

总结在同一个工程下的相关联文件,有一个文件定义了全局变量或函数,全局变量可以被其它文件 访问使用,但需要借助extern申明一下如:extern int xy; 而不是定义,如果是定义就 重复了会连接出错;且可以声明成全局或局部变量,若声明成全局变量可以被该文件下的所有 函数使用;但记住这个全局变量是其它文件定义的,本文件只是申明引用一下;

注:声明变量的extern关键字一定不能省略;

若引用其它文件的子函数,用extern申明一下,如:extern void fun();

此时这个extern关键字可以省略,一般最好不要省略,不然不好区分是定义的还是申明的;

5) 声明与定义的区别

     函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过, 但是当函 数或变量定义的时候,它就在内存中有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个 工程中任何一个地方定义的话, 那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找 不到这个变量!你也可以这样理解, 对同一个变量或函数的声明可以有多次,而定义只能有一次!

 1.cpp如下:                                            2.cpp如下:

int x,y;                               extern int x,y;

extern void PrintHello();              void PrintHello()

void Func1()                           {

{                                          cout<<"hello!"<

    x=123;                             }

}                                      void Func2()

int main()                             {

{                                          y=x*10;

    PrintHello();                      }   

    ......                             

}

在2.cpp中使用extern int x,y;只是声明了x,y这两个变量,它告诉编译器其后的变量已经在别的文件中说明,不再 为它们分配 内存。当两个文件都编译成为.obj后,连接时所有的外部变量和函数都得到统一,可以共享各自定义的全局 变量和函数。

1.cpp中使用extern void PrintHello(); 声明了引用其它文件的一个子函数;

阅读(2250) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~