auto,static,register,extern用法

C语言中的变量,可以按作用域和作用时间(即生存期)来分类

    1.按作用域可分为局部变量和全局变量

    2.按作用时间可分为静态储存方式和动态储存方式



变量作用域分类

    1.局部变量(内部变量):在函数中定义或说明的变量。

        作用域:仅限于函数内,从变量的定义点到这个函数结束为止

                        如在函数f1范围内a,b,c有效,或者说a,b,c变量的作用域限定于f1内


int f1(int a) //函数f1 
{
 	int b,c;
 	… 
}

    说明

        1:主函数中定义的变量只能在主函数中使用,不能再其他函数中使用。同时,在主函数中不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。

        2:形参变量是被调函数的局部变量,实参变量是属于主调函数的局部变量

        3:允许在不同的函数中使用相同的变量名。

        4:在复合语句中也可以定义变量,其作用域只在复合语句范围内。

  1. int main() \\6-10行为b的作用域,3-12行为s和a的作用域
  2. {
  3. int s, a;
  4. ……
  5. {        
  6. int b;
  7. s = a + b;
  8. }
  9. }
 
  1. #incude <stdio.h>
  2. int main()
  3. {
  4. int i = 3, j = 4, k; //这个k不作用于8,9行
  5. k = i*j;
  6. {
  7. int k = 78; //这个k屏蔽main中的k,只作用于8行和9行
  8. printf("%d\n",k);
  9. }
  10. printf("%d %d\n",i,k);
  11. }
        

       2.全局变量(外部变量):在函数外面定义的变量  

            作用域:变量定义点开始到整个源程序的结束。

说明

    1:全局变量必须定义在所有函数之外。

                定义格式:extern 类型说明符 变量名,变量名,…;

     2:在函数内使用全局变量要声明,且不能再赋初始值,只是表明在函数内要使用某外部变量。

                说明形式:extern 类型说明符 变量名,变量名…;

    3:如果全局变量与局部变量同名,则在局部变量作用域内,外部变量被“屏蔽”,不起作用

#include <stdio.h>


int vs(int l,int w)
{
 	extern int h;                //说明外部变量h在函数vs()中可用
 	h = 6;
 	int v;
 	v = l * w * h;
 	return v;
} 


int main()
{
 	extern int w, h;            //说明外部变量w和h在函数main()中可用
 	int l = 5;                  //此处定义了局部变量,以屏蔽外部变量l
 	printf("v = %d",vs(l, w));
}
 int l = 3, w = 4, h = 5;            //定义外部变量并赋初值




变量存储方式分类

   静态变量概念:如果在函数内定义了一个静态变量,当这个函数被调用结束时,这个变量不会随着函数结束而结束,当再次被调用时,该变量时的值还是上一个函数结束时的值。

    动态变量概念:刚好与静态变量相反,当在函数内定义了一个动态变量,当这个函数被调用结束时,这个变量也就不存在了。它的周期是从建立到函数结束,而不是程序结束。


     1. 自动变量:auto 类型说明符 变量名,变量名,…;,auto可以省略,C语言规定,函数内未加储存类型说明符的变量均视为自动变量。其属于动态存储方式。


    2.寄存器变量:register 类型说明符 变量名,变量名,…;,这种变量存放在cpu寄存器中,使用时,不需要访问内存,直接从寄存器中读写,可以提高效率。只有局部自动变量和形式参数才可以定义为寄存器变量。


    3.静态变量

            a.静态局部变量:static  类型说明符 变量名,变量名,…; 属于静态存储方式。

              说明:- 其生存周期为从定义开始到源程序结束;

                        - 它只能在其定义的函数内使用,尽管退出该函数后它还存在,但是不能在其他函数内使用它;

                        - 静态局部变量只在编译时赋初值一次,再次调用不执行初始赋值语句;

                        - 对静态局部变量而言,如果未赋初值,则系统自动赋0值。

            b.静态全局变量:static extern 类型说明符 变量名,变量名,…; 属于静态存储方式。

                说明: -  全局变量和静态全局变量都是静态存储方式,那么它们有什么不同呢?

                          - 全局变量可以在多个源文件中使用,不同之处在于,加了static之后,限制了全局变量的使用范围,使之只能在定义该变量的源文件中使用。


     4.外部变量(全局变量):前面已经介绍过了,在这里再补充几点:

                - 全局变量是从它的作用域提出的,外部变量是从它的存储方式提出的。

                - 当一个源程序有若干个源文件组成,其中一个源文件中定义的外部变量可以在其他源文件中使用。

    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值