储存说明符: auto, register, extern, static 自动变量和静态变量
储存说明符:
auto, register, extern, static
程序块 - {}
自动存储期:
auto,register
auto
自动存储期变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
auto - 自动变量/局部变量 - 局部变量在自己的程序块外不可用、不可知, 仅存在于被定义的当前执行代码块中。 退出模块就消失。
register
被register修饰的变量,会被存储在CPU内部,而不是存在内存【需要内存寻址访问】,可以提高效率。
该变量作为一个寄存器变量,让该变量的访问速度达到最快。
eg. 循环中的变量需要被频繁使用时, 可以声明为register类型。
限制:
- 无法使用 “&”来获取变量地址, 因为register没有被存放在内存中
- register变量必须是一个单个的值, 它的长度应该小于或者等于整型的长度
- 局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;
静态存储期:
extern,static
extern
extern声明一个全局变量/外部变量, 作用在整个程序工程。
extern定义和声明分开,且定义只能一次
Static VS Auto:
- static变量在静态存储区被分配存储单元, 在程序运营期间都不释放。 但是auto 自动变量/局部变量, 在动态存储区空间, 函数调用后结束后即释放。
- static变量, 只在编译时赋值一次, 【不赋值则默认为0】。 以后调用函数时不需要再次赋值,而是使用上次函数调用结束的值。 但是,为auto自动变量赋值, 不是在编译时进行赋值,而是在函数调用时进行赋值, 每调用一次,就重新赋一次初值
- 不给static赋值, static变量默认为0; 不给auto自动变量赋值,它的值是不确定的。
例子:
- static定义静态变量
/*
*41. static 定义静态变量
*/
#include <stdio.h>
/*
* static 用来说明静态变bai量。
1、如果是在函数外面定义的,那么其效果和全局变量类似,
即static说明的变量可以在当前c程序文件中使用。
2、如果是在函数内部定义的,那么这个变量只初始化一次,即使再次调用这个函数,
这个static变量也不会再次被初始化,于是,这个变量的取值就会一直保存着,
我们再次调用该函数时,仍是保存的上一次函数调用时保存的结果。
*/
int main() {
void fun();
for (int i = 0; i < 3; i++) {
fun();
}
return 0;
}
void fun(){
int i=0;
static int static_i; //没有初始化,但是static定义的静态变量自动初始化为0
printf("i = %d\n", i);
printf("static_i = %d\n", static_i);
i++;
static_i++;
}
//i = 0
//static_i = 0 // static的静态变量 可以变化
//i = 0
//static_i = 1
//i = 0
//static_i = 2
- auto储存说明符
/*
* 42。 使用auto定义变量
*
* auto:
* 1. 仅在语句块内部使用
* 2. 是 一个自动存储变量的关键字,也就是申明一块临时的变量内存。
*/
#include <stdio.h>
int main() {
int i, num;
num = 2;
for (int i = 0; i < 3; i++) {
printf("num变量为 %d\n", num);
num++;
{
auto int num = 1; // 仅在{}有用
printf("内置模块num变量为%d\n", num);
num++;//num变量调用结束后即释放。
}
}
return 0;
}
//num变量为 2
//内置模块num变量为1
//num变量为 3
//内置模块num变量为1
//num变量为 4
//内置模块num变量为1
- static和auto做对比, static的另一种做法
/*
* 43。 static的另一种用法
*/
#include <stdio.h>
int main() {
int i,num;
num=2;
for (int i = 0; i < 3; i++) {
printf("num变量为 %d\n", num);
num++;
{
static int num = 1;
printf("内置模块num变量为%d\n", num);
num++; //static num 变量调用结束后不释放, 被保存。
}
}
return 0;
}
//num变量为 2
//内置模块num变量为1
//num变量为 3
//内置模块num变量为2
//num变量为 4
//内置模块num变量为3
- extern全局变量
/*
* 44。 extern的用法
*/
#include <stdio.h>
int a,b,c;//在外面定义 extern
void add(){
int a = 3;
c = a + b;
}
int main() {
a = b = 4;
add();
printf("c的值为%d\n", c);
return 0;
}
- register
/*
* 45. 使用register定义变量
*/
#include <stdio.h>
int main() {
register int i;
int tmp = 0;
for (int i = 0; i <= 100 ; i++)
tmp+=1;
printf("总和为 %d\n", tmp);//101
return 0;
}
//总和为 101