变量的存储类型与作用域[重点]

当我们定义了一个变量,C语言编译系统就会按照定义时的数据类型给该变理安排若干个字节来存放该变量的值。在计算机的内存和CPU寄存器中都可以存放数据,而内存中又可以分为一般数据区堆栈区。我们把变理存放在哪个区域称为变量的存储类型。用户可以通过变理的定义语句中的存储类型符来选择变量的具体存储区域。

含有存储类型符的变量定义语句格式如下:
  存储类型符   数据类型符   变量名1,变量名2, ... ...

变量的存储类型:
自动型(auto)   存储区域:内存堆栈区    (系统默认内部变量为auto)
寄存器型 ( register )    存储区域:CPU的通用寄存器  (一般C语方允许定义二个左右为宜) [一般在函数中定义(内部变量)]
静态型( static )        存储区域:内存的数据区  ( 在程序开始时就分配了固定的内存,程序结束时才释放内存 )
外部参照型 ( extern )  专用于多个编译单位数据传送。

外部参照型变量不允许进行初始化,其它的可以进行初始化。

变量的生存周期和作用域:
变量的生存期
变量的作用域(变量可以使用的程序区域)

外部变量与内部变量(从变量定义位置来划分)
全局变量和局部变量(从变量的生存周期来划分)

几点说明:
外部变量只能定义为无存储类型或静态型
被说明为static存储型的内部变量是全局变量,在整个程序运期存都存在,它的作用域只是所定义的函数或复合语句
外部变量是不能重命名的,内部变量可以在不同的函数或复合语句中重命名,包括static存储类型的内部变量(因为它们彼此的作用域是不同的)。
外部变量总是全局变量

外部静态变量/函数

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

使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

示例程序:

//file1.cpp

static int varA;

int varB;

extern void funA()

{

……

}

static void funB()

{

……

}

//file2.cpp

extern int varB; // 使用file1.cpp中定义的全局变量

extern int varA; // 错误! varAstatic类型, 无法在其他文件中使用

extern vod funA(); // 使用file1.cpp中定义的函数

extern void funB(); // 错误! 无法使用file1.cpp文件中static函数
原文地址:https://www.cnblogs.com/_programmer/p/1575910.html