开发者学堂课程【你的第一门 C 语言课:生存期和存储类型】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/444/detail/5481
生存期和存储类型
内容介绍:
一、 生存期
二、 存储类型
三、 寄存器变量(register)
四、 静态局部变量(static)
五、 静态局部变量(static)
六、 static 和 extern
一、 生存期
C 语言的变量拥有两种生存期
一静态存储期(static storage duration)
一自动存储期(automatic storage duration)
具有文件作用域的变量属于静态存储期,函数也属于静态存储期。属于静态存储期的变量在程序执行期间将一直占据存储空间,直到程序关闭才释放。
具有代码块作用域的变量一般情况下属于自动存储期。属于自动存储期的变量在代码块结束时将自动释放存储空间。
#include
int A;
static int B;
extern int C;
void func(int m,int n)
{
int a, b, c;
}
int main(void)
{
i
nt i,j,k;
r
eturn
0
;
}
二、存储类型
存储类型其实是指存储变量值的内存类型,C 语言提供了5中不同的存储类型:
- auto
- register
- static
- extern
- typedef
三、自动变量( auto)
在代码块中声明的变量默认的存储类型就是自动变量,使用关键字 auto 来描述。
#include
int main()
{
auto int i, j, k;
return 0;
}
由于这是默认的存储类型,所以不写auto是完全没问题的。
四、寄存器变量(register)
将一个变量声明为寄存器变量,那么该变量就有可能被存放于 CPU 的寄存器中。
寄存器变量和自动变量在很多方面的是一样的,它们都拥有代码块作用域,自动存储期和空连接属性。
不过这里有一点需要注意的是:当你将变量声明为寄存器变量,那么你就没办法通过取址运算符获得该变量的地址。
#inc
l
ude
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 va
r
iable
‘i' requested
发现报错
去掉 register 进行测试
#inc
l
ude
int main()
{
int i = 520;
printf("Addr of i: %p\n",&i);
return 0;
}
运行: gcc testl.c && ./a.out
结果:A
ddr of i: 0xbfbd088c
就没有问题了
结论:当你将变量声明为寄存器变量,那么你就没办法通过取址运算符获得该变量的地址。
五、静态局部变量(static)
使用 static 来声明局部变量,那么就可以将局部变量指定为静态局部变量。
static 使得局部变量具有静态存储期,所以它的生存期与全局变量一样,直到程序结束才释放。
#incLude
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
int count;
void func(void )
{
printf("count = %d\n", count);
}
运行: gcc test3.c && ./a.out
结果:count = 520