理解和如何使用关键字auto、static、extern、register

本文介绍了C语言中的四个关键存储类别:auto(自动变量),static(静态变量),extern(外部变量声明)和register(寄存器变量)。auto变量在函数调用时分配和释放存储;static修饰的局部变量在函数调用间保持其值;全局变量用static修饰限制其作用域;extern用于在不同文件间共享变量;register尝试将变量存储在CPU寄存器以提高效率。
摘要由CSDN通过智能技术生成


前言

   这篇文章主要介绍C语言中的4个关键字


一、auto---自动变量

     函数中定义的局部变量,如果不专门声明为static(静态)存储类别,都是动态地分配存储空间的,数据存储在动态存储区中,在调用函数时,系统会给这些变量分配存储空间,在函数调用结束时就会自动释放这些存储空间。这类局部变量称为自动变量。自动变量使用关键字auto作存储类别的声明。例:

int test()
{
    auto int a=3; //定义a为自动变量
      

}

  其中,a是自动变量,对a赋值为3,执行完test后,自动释放 a所占的存储单元。

实际上,关键字auto可以省略,不写auto则隐含指定为“自动存储类别”,属于动态存储方式。

如:在函数体中 

int a = 2;

auto int a = 2;

等价

  程序中大多数变量属于自动变量,在函数中定义的变量都没有声明为 auto,其实都隐含指定为自动变量

二、static

     1.static修饰局部变量

      当函数中的局部变量被关键字static修饰时,其局部变量的值在函数调用结束后不消失而继续保留原值,即占用存储单元不会释放,在下次调用该函数时,该变量已有值(就是上次函数调用结束时的值)

代码如下(示例):

void test1()
{
    int a=1;
    a++;
    printf("%d\n",a);      

}


void test2 ()
{
   static int a=1; //静态变量
    a++;
    printf("%d\n",a);

}


int main()
{
    for(int i=0;i<3;i++)
    {
        test1();
        test2();

    }
   return 0;
}

 上面的执行结果是调用test1的,当调用test1时a变量会被创建,调用完出test1时变量a就被释放了,就不会保存之前调用的值,也即每次调用时a都会重新创建一次。

这是调用test2结果,当每次调用时 a的值都会保留前一次调用的结果,即此时的a在第一次编译时就创建了

总之, static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束

       在一个程序的多个文件中,如果一个文件中的全局变量用static修饰就会改变全局变量的链接属性,即不再具有外部链接属性,此时该文件的全局变量就只能在本文件内部使用,那么其他文件就不能引用该文件的全局变量了。    

代码如下(示例):

代码2中,case.c文件中的变量b由static修饰,故test.c文件就无法引用b变量了。


 3.static修饰函数

       

 代码2中的函数由static修饰,编译会有连接错误

  二、extern

      如果一个程序包含两个文件,在两个文件中都要用同一个外部变量,不能分别在两个文件中各自定义一个外部变量,否则在进行程序连接时会出现“重复定义”的错误。正确的做法是:在一个文件中定义外部变量而在另一个文件中用extern对外部变量作“外部变量声明”。在编译和链接时,系统就会知道有“外部链接”,就可以从别处找到已定义的外部变量,并将在另一个文件中定义的外部变量的作用域扩展收到本文件,在本文件中可以合法的引用外部变量了。

代码示例:

三、register---寄存器变量

      一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的。当程序中用到哪个变量的值时,有控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存中存放。

 如果一些变量使用频繁,为提高执行效率,允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器中取出参加运算,不必再到内存中去取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样可以提高执行效率。当定义变量时就可用关键字register作声明。如:

register  int  a;         //定义a为寄存器变量

注意:1. 三种局部变量的存储位置是不同的:自动变量存储在动态存储区;静态局部变量存储在                   静态存储区;寄存器存储在CPU中的寄存器中。

            2. 用auto、register、和static声明变量时,是在定义变量的基础上加上这些关键字,而不能单独使用。但用extern声明外部变量时,则类型名可以省略,只须写外部变量名即可。


总结

          以上就是今天要讲的内容,本文对5个关键字进行了讲解,或许讲的不那么好,但是希望对大家也能有所帮助吧!

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值