内容介绍:
一、生存期
二、存储类型
三、寄存器变量(register)
四、静态局部变量(static)
五、静态局部变量(static)
六、static和extern
一、 生存期
C语言的变量拥有两种生存期
一静态存储期(static storage duration)
一自动存储期(automatic storage duration)
具有文件作用域的变量属于静态存储期,函数也属于静态存储期。属于静态存储期的变量在程序执行期间将一直占据存储空间,直到程序关闭才释放。
具有代码块作用域的变量一般情况下属于自动存储期。属于自动存储期的变量在代码块结束时将自动释放存储空间。
#include <stdio.h>
int A;
static int B;
extern int C;
void func(int m,int n)
{
int a, b, c;
}
int main(void)
{
int i,j,k;
return 0;
}
二、 存储类型
存储类型其实是指存储变量值的内存类型,C语言提供了5中不同的存储类型:
- auto
- register
- static
- extern
- typedef
三、自动变量( auto)
在代码块中声明的变量默认的存储类型就是自动变量,使用关键字auto来描述。
#include <stdio.h>
int main()
{
auto int i, j, k;
return 0;
}
由于这是默认的存储类型,所以不写auto是完全没问题的。
四、寄存器变量(register)
将一个变量声明为寄存器变量,那么该变量就有可能被存放于CPU的寄存器中。
寄存器变量和自动变量在很多方面的是一样的,它们都拥有代码块作用域,自动存储期和空连接属性。
不过这里有一点需要注意的是:当你将变量声明为寄存器变量,那么你就没办法通过取址运算符获得该变量的地址。
#include <stdio.h>
int main()
{
register int i = 520;
printf("Addr of i: %p\n",&i);
return 0;
}
运行: gcc testl.c && ./a.out
testl.c In function 'main' :
testl.c:7: error: addressof register variable ‘i' requested
发现报错
去掉register进行测试
#include <stdio.h>
int main()
{
int i = 520;
printf("Addr of i: %p\n",&i);
return 0;
}
运行: gcc testl.c && ./a.out
结果:Addr of i: 0xbfbd088c
就没有问题了
结论:当你将变量声明为寄存器变量,那么你就没办法通过取址运算符获得该变量的地址。
五、静态局部变量(static)
使用static来声明局部变量,那么就可以将局部变量指定为静态局部变量。
static使得局部变量具有静态存储期,所以它的生存期与全局变量一样,直到程序结束才释放。
#incLude <stdio.h>
void func(void) ;
void func (void);
{
static int count=0;
printf("count = %d\n",count) ;
count++
}
int main(void )
{
inti;
for(i=0;i<10;i++)
{
func();
}
return 0 ;
}
运行: gcc test2.c && ./a.out
结果:
count = 0
count = 1
count = 2
count = 3
count = 4
count = 5
count = 6
count = 7
count = 8
count = 9
六、static和extern
作用于文件作用域的static和extern, static关键字使得默认具有external链接属性的标识符变成internal链接属性,而extern关键字是用于告诉编译器这个变量或函数在别的地方已经定义过了,先去别的地方找找,不要急着报错。
static具有自动存储期,extern具有静态存储期
案例:编辑两个进行test测试
Void func();
Int vount = 520;
Int main()
{
Func();
}
#include <stdio. h>
int count;
void func(void )
{
printf("count = %d\n", count);
}
运行: gcc test3.c && ./a.out
结果:count = 520