zoukankan      html  css  js  c++  java
  • c语言局部变量、全局变量、静态变量、内部函数、外部函数、声明、定义、extern作用总结

    一、先搞一波概念

    变量按作用域分:

    1.局部变量:

      (1)在函数的开头定义(如定义形参)。

      (2)在函数内部定义(如在函数里面定义的变量)。

      (3)在函数内部的复合语句定义(如for循环,花括号内)。

      前两种方式定义的变量可以在函数内任何地方使用,而第三种方式定义的变量只能在复合语句内使用。

    说明:

      (1)不同函数同一函数不同复合语句,可以使用同名变量,它们表示不同对象,互不干扰。

    2.全局变量

      在函数之外定义的变量称为全局变量,也称为外部变量,其作用域为从定义变量的位置开始到本源文件结束。

    说明:

      (1)因为函数只能返回一个返回值,因此可以通过使用全局变量来实现一个函数改变多个值后,还能被其他函数调用。

      (2)全局变量在程序执行整个过程中都占用存储单元,使用太多全局变量所以占用空间比较大。

      (3)局部变量会屏蔽同名的全局变量,即局部变量优先。

    按变量的存储方式来分:

    3.动态存储方式

      程序运行期间根据需要进行动态分配存储空间方式。

    说明:

      (1)函数结束时自动释放存储空间。

      (2)同一个动态变量被执行两次,其存储空间的地址不一定相同,因为其第一次调用完后会释放地址,第二次调用不一定还是分配第一次调用的地址,所以导致动态变量在定义时不初始化,

        其值为随机数(不能确保分配的地址上存了什么数)。

    4.静态存储方式

      程序运行期间由系统分配固定的存储空间的方式。

    说明:

      (1)在程序执行整个过程中都占用存储单元,如果静态变量在定义时不初始化,其值都为0或“”。

    5.变量存储类别

      在c语言中,每一个变量和函数都是有两个属性:数据类型和数据的存储类别。c语言中分为四种类别:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern),自动变量存放在动态存储区,静态变量和外部变量存放在静态存储区中,寄存器变量存放在CPU的寄存器中。如果在定义或者声明时没有指定,系统会采取默认方式。

    重点来了:

    1.局部变量与存储类别的关系

    1)自动变量(格式:auto 变量):

      在局部变量中,只要不指定其为静态存储类别(static),都是以动态分配存储空间,所以当定义一个自动变量时,可以省略(auto),如形参等,在程序中推荐使用,也是使用最多的一个变量

    (2)静态局部变量(格式:static):

      使用关键字static来定义,在函数调用完不释放空间,在下次调用时,还保留上一次的值。一般使用它比较有技巧,比如计算n!,可以循环调用一个函数实现累乘,把结果存放在一个静态局部变量中(这个变量可以在被调函数中,这可以放在主调函数中,当然还可以把它换成全局变量,效果都一样)。

    说明:

      (1)静态局部变量只在编译时赋值,即只在编译时执行“static int a = 1 ” 这句代码一次,无论运行期间调用这句代码所在的函数多少次,前提是必须在定义的同时赋值;而自动局部变量,没调用一次就执行定义赋值一次。

    如下代码:

      (2)使用静态存储要多占内存,降低程序可读性,不要过多使用。

      (3)局部变量无声明(extern)

    2.全局变量与存储类别的关系

    (1)所有全局变量都是静态变量,都存在静态存储区。

    (2)所有外部变量不加static修饰,都可以使用关键字extern来声明(格式为 extern(int可省略类型) a;),可以扩张其作用域从声明处开始,还可以跨源文件声明使用。

    (3)在外部变量前面加static修饰符,可将外部变量限制在本文件中。这里有一个坑,如果变量为static全局变量,在函数内不能扩张其作用域,必须在函数外声明以达扩张效果(包括主函数)。

    (4)外部变量和局部变量都只能定义一次,但外部变量可以声明多次,而局部变量不能有声明。

    (5)所谓变量的声明,只是把作用域扩张到声明处以下,仅仅而已,而且只有这一种声明方法。

    这篇文章只总结变量的声明和定义吧,函数的放到这里总结吧,这样显得没那么乱!

  • 相关阅读:
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    POJ 3162 Walking Race (树的直径,单调队列)
    POJ 2152 Fire (树形DP,经典)
    POJ 1741 Tree (树的分治,树的重心)
    POJ 1655 Balancing Act (树的重心,常规)
    HDU 2196 Computer (树形DP)
    HDU 1520 Anniversary party (树形DP,入门)
    寒门子弟
    JQuery选择器(转)
    (四)Web应用开发---系统架构图
  • 原文地址:https://www.cnblogs.com/eve612/p/13831785.html
Copyright © 2011-2022 走看看