Chinaunix首页 | 论坛 | 博客
  • 博客访问: 453651
  • 博文数量: 72
  • 博客积分: 3186
  • 博客等级: 中校
  • 技术积分: 1039
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-07 16:53
文章分类

全部博文(72)

文章存档

2012年(1)

2011年(5)

2010年(10)

2009年(56)

我的朋友

分类: C/C++

2009-03-08 22:23:35

复习做个笔记,以免再次模糊。
从三个角度来看变量的存储。笔记摘自谭浩强的〈c程序设计〉第三版。
一、作用域
 
局部变量:
   自动变量:即动态局部变量,离开函数,值就消失,内存单元释放。
   静态局部变量:离开函数,值仍保留,但只能为本函数使用,分配固定的内存单元。static
   寄存器变量,离开函数,值就消失,寄存器释放。register
   形式参数可以定温文尔雅为自动变量或寄存器变量
 全局变量: 
   静态外部变量,只限本文件引用,分配固定的内存单元
   外部变量,没有用static关键字声明,允许其他文件引用,在其他文件引用时,每次都加上extern声明
 说明:
  1.主函数main中定义的变量也只能在主函数中有效,不因为在主函数中定义而在整个文件或程序中有效,主函数中不能使用其他函数中定义的变量。
  2.不同函数中可以使用相同的变量名,它们代表不同的对象,内存中占不同单元,互不干扰。
  3.形式参数也是局部变量,只有调用函数时才分配内存,函数结束,内存单元释放。
  4.一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,离开该复合语句该变量就无效。
  5.全局变量增加了函数间的通信,但在函数中改变了全局变量的值,就影响了其他函数。不建议使用全局变量,原因如下:
   全局变量在程序的全部执行过程中占用存储单元
   它使函数的通用性降低。一般要求把c程序的函数做成一个封闭体,只可以通过“实参->形参”的方式与外界发生联 
   系。这样程序的可移植性好。
   使用全局变量过多,降低程序的清晰性,难以判断出每个瞬间外部变量的值。
  若在同一文件中外部变量与局部变量同名,则在局部变量作用范围内,外部变量不起作用。
  习惯上将全局变量第一个字母用大写表示。
  6.静态存储变量在整个运行期间都不释放,占静态存储空间;动态存储占动态存储空间,函数调用结束后释放。
  7.静态局部变量是在编译时赋初值的,只在编译时赋初值一次,以后每次调用函数都引用上次调用结束时的值而不再重新赋
初值。而自动变量不是在编译时赋初值的,而是调用时重新给一次初值。
  8。程序的编译单位是源程序的一个文件。

二、时间
 动态存储:
   自动变量,auto(默认,可省略),自动局部变量在本函数内有效,(自动全局变量在本文件有效,其他文件可引 
   用,引用时加extern声明。为静态存储,有固定内存单元)
   寄存器变量,本函数内有效。
   形式参数,本函数内有效。
 静态存储:
   静态局部变量,函数内有效,值保留,其他函数不可使用,分配固定内存单元。
   静态外部变量,本文件有效,其他文件内不可引用。
   外部变量,同自动外部变量,其他文件可引用,加extern

三、变量存放的位置
 内存中静态存储区:
   静态局部变量
   静态外部变量,其他文件不可引用
   外部变量,其他文件可引用
 内存中动态存储区:
   自动变量和形式参数,函数外消失
 cpu寄存器中:
   函数外消失

声明和定义
对函数,声明是函数的原型,放在主调函数中的声明部分的。而定义是函数的本身,包括函数首部和  函数体,是一个独立模块。
对变量,声明包括定义。如:int a;建立了存储空间,称为定义性声明。
                                        extern a;不再建立存储空间,称为引用性声明。
 一般为了叙述方便,把建立存储空间的声明称定义,把不需要建立存储空间的声明称声明。

 对外部变量的定义只能有一次,它的位置在所有函数之外,而同一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,
哪个函数要用就在哪个函数中声明,也可以在函数体外。系统根据定义分配内存单元,而不是根据声明分配。extern只用作声明而不用作定义

局部变量用static声明,则使该变量在整个程序执行期间不释放,分配的内存单元始终存在。
外部变量用static声明,则该变量只能在本文件中使用,而不能在其他文件中使用。
 

内部函数和外部函数
函数本质上是全局的,因为一个函数要被另外的函数调用,但是也可以指定函数不能被其他文件调用。根据函数能否被其他函数调用,将函数区分为内部函数和外部函数。
内部函数:一个函数只能被本文件中其他函数所调用,称为内部函数。定义时,函数和函数类型的前面加上static.
即:static int fun(int a,int b);
内部函数又称为静态函数。作用域只限于所在文件,在不同的文件中有同名的内部函数,互不干扰。
外部函数:定义时加上extern,可供其他函数调用。
extern int fun(int a,int b);
若省略,则隐含为外部函数,默认值。
在需要调用此函数的文件中,用extern作声明。表示该函数是其他文件中定义的外部函数。为方便,c语言允许在声明函数时省写extern.
用#include命令扩展函数的作用域。
阅读(1469) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~