C语言----变量生存期(高阶篇三十八)

  变量的生老病死

    所有变量都占着内存,变量什么时候开始占着内存,什么时候从内存中消失,这叫做变量的生存周期。

      按照变量的生存周期分类有:

        ※自动变量auto

        ※静态变量static

        ※寄存器变量register

        ※外部变量extern

 

        ※函数也有外部函数extern和静态函数static两种

  变量作用域

    有时候变量还未消亡,你却不能使用它,这就是变量作用域在作怪。

    按照变量作用域分局部变量和全局变量。它们没有什么关键字修饰,只是看你在什么部位定义变量。

    从变量生存期和作用域来分析几种不同种类变量的特性。

  局部变量

    定义局部变量的关键字为auto,也叫自动变量。

    C语言规定自动变量在定义时前面的auto可以省略。

      如:int a;   等价于  auto int a;

  全局变量

    在函数外面定义的变量都是全局变量,不管它用什么关键字修饰。

    全局变量的特点:

      ※全局变量的生存期和作用域在从它的定义点开始,一直到本文件的程序结束前,都是有效的,程序结束后消亡,释放内存。

      ※全局变量作用域中的所有函数将共享这个全局变量中的内存数据,各函数之间也可以通过全局变量传送数据,但在职业程序员中,这是种很不好的习惯。

    注意:在同一作用域中,如果局部变量与全局变量重名,全局变量将暂时退居幕后,这时只能操作局部变量。

 

    程序1

      局部变量和全局变量

// 38-1变量生存期.c

#include <stdio.h>

int a = 1, b = 2;     //全局变量

void fun(int c,int d)
{
    int a = 3, b = 4;    //局部变量与全局变量重名,隐藏全局变量
    auto int e = 5;      //自动局部变量  int e = 5; 相等
    int f = 6;    //局部变量
    printf("在fun函数中使用局部变量:c = %d\n", c);
    printf("在fun函数中使用局部变量:e = %d\n", e);
    printf("在fun函数中使用全局变量:a = %d\n", a);


}


int g = 10, h = 11;   //全局变量
main()
{
    int i = 12, j = 13;  //局部变量
    fun(i, h);
    printf("在main函数中使用全局变量:a = %d\n", a);
    printf("在main函数中使用全局变量:g = %d\n", g);

}

 

  静态变量

    静态变量在程序执行点离开它的作用域时,它并不消亡,它还会死霸着那片内存不放,等着你别的函数下次来使用它。与全局变量不同的是:静态变量通常在函数内部定义,而全局变量只能在函数外部定义。它们的共同点是:在程序结束时,它们都会消亡。   

    程序2

      静态变量

// 38-2静态变量static.c
//

#include <stdio.h>
void fun()
{
    static int i = 0;   //静态局部变量    一直占用内存区
    int a = 0;            //局部变量
    i++;
    a++;
    printf("静态变量值:i = %d\n,自动变量值:a = %d\n", i, a);
}

main()
{
    fun();
    fun(); 
    fun();
}

  寄存器变量

    寄存器变量不放在内存中,直接放在CPU寄存器中。因为CPU中的寄存器数量有限,所以寄存器变量不能设置太多。

    寄存器变量的特点是:比普通内存速度快上百倍。

  外部变量

    如果一个文件要使用其它文件中的全局变量,就要使用extern声明,这样它就可以和其它文件共享此变量。

 

posted @ 2021-11-17 12:05  httpcc  阅读(389)  评论(0编辑  收藏  举报