存储类型的关键字有四个auto(自动),extern(外部),static(静态),register(寄存器)
关键字auto
自动变量auto的作用域局限于定义它的块,从块内定义之后直到该块结束前有效。当执行的控制进入块时,系统为自动变量在栈上分配内存,当退出块时,系统释放分配给自动变量的内存,因此,变量的值就消失了。
关键字extern
(1)外部变量的存储类型是extern,但是在定义的时候不使用关键字extern.
(2)外部变量的生命周期是永久的,存在于整个程序的执行期间。如果定义时没有对外部变量显示初始化,其缺省初值是0,如果有显示初始化,只执行一次赋初值操作。
(3)外部变量的作用域是从定义之后直到该源文件结束的所有函数,通过用extern进行声明,外面变量的作用域可以扩大到整个程序的所有文件。
(4)外部变量的声明语句可以在函数之外,也可以在函数内部。如果在函数之外,则从声明之后到文件结束的所有函数都有效。如果在函数内部,则所用使用该外部变量的函数内部都要写一条声明语句。
(5)在定义局部变量的块内,同名的外部变量不起作用。
关键字static
关键字static有两种截然不同的用法:
(1) 用于定义局部变量,称为静态局部变量。
静态局部变量的作用域和自动变量一样,只作用于它的块。区别是:静态局部变量在程序执行期间不会消失,它的值具有连续性,即当退出块时,它的值可以保存下来,以便再次进入块时使用,而自动变量的值在退出块时就消失了。
(2) 用于定义外部变量,称为静态外部变量。
静态变量的存储分配方式是静态分配方式,其生命周期是永久的,存在于整个程序的执行期间,缺省初值是0
静态外部变量和外部变量的唯一区别是作用域的限制。静态外部变量只能作用于定义它的文件。而外部变量用extern声明后可以作用于其他文件。
关键字register
此关键字只能用来定义局部变量,且把该变量存储在计算机的高速硬件寄存器中,除此之外和自动变量完全相同。
PS :作用域
局部变量的作用域是该变量所在的程序块。
外部变量的作用域从其定义处开始一直到其所在文件的末尾。
关键字auto
自动变量auto的作用域局限于定义它的块,从块内定义之后直到该块结束前有效。当执行的控制进入块时,系统为自动变量在栈上分配内存,当退出块时,系统释放分配给自动变量的内存,因此,变量的值就消失了。
关键字extern
(1)外部变量的存储类型是extern,但是在定义的时候不使用关键字extern.
(2)外部变量的生命周期是永久的,存在于整个程序的执行期间。如果定义时没有对外部变量显示初始化,其缺省初值是0,如果有显示初始化,只执行一次赋初值操作。
(3)外部变量的作用域是从定义之后直到该源文件结束的所有函数,通过用extern进行声明,外面变量的作用域可以扩大到整个程序的所有文件。
(4)外部变量的声明语句可以在函数之外,也可以在函数内部。如果在函数之外,则从声明之后到文件结束的所有函数都有效。如果在函数内部,则所用使用该外部变量的函数内部都要写一条声明语句。
(5)在定义局部变量的块内,同名的外部变量不起作用。
关键字static
关键字static有两种截然不同的用法:
(1) 用于定义局部变量,称为静态局部变量。
静态局部变量的作用域和自动变量一样,只作用于它的块。区别是:静态局部变量在程序执行期间不会消失,它的值具有连续性,即当退出块时,它的值可以保存下来,以便再次进入块时使用,而自动变量的值在退出块时就消失了。
(2) 用于定义外部变量,称为静态外部变量。
静态变量的存储分配方式是静态分配方式,其生命周期是永久的,存在于整个程序的执行期间,缺省初值是0
静态外部变量和外部变量的唯一区别是作用域的限制。静态外部变量只能作用于定义它的文件。而外部变量用extern声明后可以作用于其他文件。
关键字register
此关键字只能用来定义局部变量,且把该变量存储在计算机的高速硬件寄存器中,除此之外和自动变量完全相同。
PS :作用域
局部变量的作用域是该变量所在的程序块。
外部变量的作用域从其定义处开始一直到其所在文件的末尾。