储存说明符: auto, register, extern, static 自动变量和静态变量

储存说明符:

auto, register, extern, static

程序块 - {}

自动存储期:

auto,register

auto

自动存储期变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。

auto - 自动变量/局部变量 - 局部变量在自己的程序块外不可用、不可知, 仅存在于被定义的当前执行代码块中。 退出模块就消失。

register

被register修饰的变量,会被存储在CPU内部,而不是存在内存【需要内存寻址访问】,可以提高效率。

该变量作为一个寄存器变量,让该变量的访问速度达到最快。

eg. 循环中的变量需要被频繁使用时, 可以声明为register类型。

限制:
  1. 无法使用 “&”来获取变量地址, 因为register没有被存放在内存中
  2. register变量必须是一个单个的值, 它的长度应该小于或者等于整型的长度
  3. 局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;

静态存储期:

extern,static

extern

extern声明一个全局变量/外部变量, 作用在整个程序工程。

extern定义和声明分开,且定义只能一次

Static VS Auto:
  1. static变量在静态存储区被分配存储单元, 在程序运营期间都不释放。 但是auto 自动变量/局部变量, 在动态存储区空间, 函数调用后结束后即释放。
  2. static变量, 只在编译时赋值一次, 【不赋值则默认为0】。 以后调用函数时不需要再次赋值,而是使用上次函数调用结束的值。 但是,为auto自动变量赋值, 不是在编译时进行赋值,而是在函数调用时进行赋值, 每调用一次,就重新赋一次初值
  3. 不给static赋值, static变量默认为0; 不给auto自动变量赋值,它的值是不确定的。

例子:

  1. 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
  1. 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
  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
  1. 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;
}
  1. 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
posted @ 2021-03-08 13:30  NTE701  阅读(328)  评论(0编辑  收藏  举报
1