c语言有五种不同类型的存储类,了解他们会十分有助于对c语言的理解程度。
描述c语言的存储类有作用域,链接类型以及存储时期三种描述方法。
作用域是用来描述变量的可以引用的区域的一个概念,一般情况下使用的都是代码块作用域,就是在一块代码的{}内部有用的区域,还有一种叫做文件作用域,就是从他开始定义的地方开始到文件结束的地方都有用,这一般叫做全局变量。
链接类型有两种,一种是内链接,一种是外联结,还有空链接。具有代码块作用域的叫做空链接,具有文件作用域的一般有内链接或者外链接,一个有外链接的可以在任何一个文件里边引用,一个有内链接的可以仅仅在当前文件里边引用,标识内链接的用关键字static。
存储时期是表示一个变量会在程序运行的什么时候存在的概念,有静态存储时期和动态存储时期两种,一般的代码块作用域都是动态存储时期,全局变量是静态存储时期,static标识着她是一个内链接而不是静态存储区域,这一点要注意。比如一个标识了static文件作用域变量具有内链接,没有static标识是具有外链接,但是无论有没有static关键字,都代表静态存储时期。动态存储时期代表着,进入这个代码块的时候,这个变量会被初始化,但是结束这个代码块的时候就会把这个内存快释放。静态内存块代表着在程序运行的整个时间这个变量都会存在。
而存储类有五种,分别是自动,寄存器,具有外部链接的静态存储类,具有内部连接的存储类,空链接的静态类。
自动类型的存储类,拥有代码块作用域,自动存储时期,空链接。一般用aoto标识,但是没有的话,默认是aoto。如果在一个代码块里边有一个和外部的变量同名的变量的话,就会覆盖外部的变量。
寄存器变量是用register标示符来标识的,有代码块作用域,空链接,自动存储时期。寄存器是存在cpu内的硬件设施,可以供cpu更快的访问,如果一个变量经常的访问的话,可以设置为寄存器变量,但是这仅仅是一种请求,编译器会根据当前的cpu以及内存情况来采取措施。
具有空链接的静态变量,也称为具有代码块作用域的静态变量,这就代表着,这个变量仅仅在这个代码块内部可以被访问到,但是存储时期确实静态的,在整个程序内都会存在。
例如以下代码:
void test()
{
static int a =0;
a++;
printf("%d",a);
}
int main()
{
test();
test();
return 0;
}
就会输出:
01
具有外部链接的静态变量,代表这个变量具有静态存储时间,并且有外部链接,可以被任何文件使用,具有文件作用域。一般默认初始化为0。在其他文件使用的时候需要声明extern int a;才可以。
具有内部连接的静态变量是具有静态存储时期,但是只能在单个文件内可以使用。就是在外部用static声明的全局变量而已。
同时,函数也有静态的概念,在文件里定义的函数可以被外部文件使用,但是加上了static关键字以后就会仅仅会被当前文件使用了。
描述c语言的存储类有作用域,链接类型以及存储时期三种描述方法。
作用域是用来描述变量的可以引用的区域的一个概念,一般情况下使用的都是代码块作用域,就是在一块代码的{}内部有用的区域,还有一种叫做文件作用域,就是从他开始定义的地方开始到文件结束的地方都有用,这一般叫做全局变量。
链接类型有两种,一种是内链接,一种是外联结,还有空链接。具有代码块作用域的叫做空链接,具有文件作用域的一般有内链接或者外链接,一个有外链接的可以在任何一个文件里边引用,一个有内链接的可以仅仅在当前文件里边引用,标识内链接的用关键字static。
存储时期是表示一个变量会在程序运行的什么时候存在的概念,有静态存储时期和动态存储时期两种,一般的代码块作用域都是动态存储时期,全局变量是静态存储时期,static标识着她是一个内链接而不是静态存储区域,这一点要注意。比如一个标识了static文件作用域变量具有内链接,没有static标识是具有外链接,但是无论有没有static关键字,都代表静态存储时期。动态存储时期代表着,进入这个代码块的时候,这个变量会被初始化,但是结束这个代码块的时候就会把这个内存快释放。静态内存块代表着在程序运行的整个时间这个变量都会存在。
而存储类有五种,分别是自动,寄存器,具有外部链接的静态存储类,具有内部连接的存储类,空链接的静态类。
自动类型的存储类,拥有代码块作用域,自动存储时期,空链接。一般用aoto标识,但是没有的话,默认是aoto。如果在一个代码块里边有一个和外部的变量同名的变量的话,就会覆盖外部的变量。
寄存器变量是用register标示符来标识的,有代码块作用域,空链接,自动存储时期。寄存器是存在cpu内的硬件设施,可以供cpu更快的访问,如果一个变量经常的访问的话,可以设置为寄存器变量,但是这仅仅是一种请求,编译器会根据当前的cpu以及内存情况来采取措施。
具有空链接的静态变量,也称为具有代码块作用域的静态变量,这就代表着,这个变量仅仅在这个代码块内部可以被访问到,但是存储时期确实静态的,在整个程序内都会存在。
例如以下代码:
void test()
{
static int a =0;
a++;
printf("%d",a);
}
int main()
{
test();
test();
return 0;
}
就会输出:
01
具有外部链接的静态变量,代表这个变量具有静态存储时间,并且有外部链接,可以被任何文件使用,具有文件作用域。一般默认初始化为0。在其他文件使用的时候需要声明extern int a;才可以。
具有内部连接的静态变量是具有静态存储时期,但是只能在单个文件内可以使用。就是在外部用static声明的全局变量而已。
同时,函数也有静态的概念,在文件里定义的函数可以被外部文件使用,但是加上了static关键字以后就会仅仅会被当前文件使用了。