C语言存储

参考:

C存储类-菜鸟教程
C语言register关键字—最快的关键字
c primer plus 6th edition
C作用域规则


变量

作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。

  1. 在函数内部或块内部的局部变量
    在某个函数或块的内部声明的变量称为局部变量。它们只能被函数或该代码内部的语句使用。
    局部变量在函数外部是不可知的。下面是使用局部变量的实例。在这里,所有的变量 a、b 和 c 是 main() 函数的局部变量。
    #include 

    int main ()
    {
      /* 局部变量声明 */
      int a, b;
      int c;

      /* 实际初始化 */
      a = 10;
      b = 20;
      c = a + b;

      printf ("value of a = %d, b = %d and c = %dn", a, b, c);

      return 0;
    }
  1. 在所有函数外部的全局变量
    全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。
    全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序都可以用。
#include
/* 全局变量 */
int g;
int main(){
  return 0;
}

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。

    #include 

    /* 全局变量声明 */
    int g = 20;

    int main ()
    {
      /* 局部变量声明 */
      int g = 10;

      printf ("value of g = %dn",  g);

      return 0;
    }

运行结果是:

value of g = 10
  1. 在形式参数的函数参数定义中
    函数的参数,形式参数,被当作该函数内的局部变量,它们会优先覆盖全局变量。

作用域

一个C变量的作用域可以是块作用域,函数作用域,函数原型作用域或文件作用域。

  • 块作用域
    块是一对花括号括起来的代码区域。
    我们使用的局部变量都具有块作用域。
double blocky(double cleo){
  double patrick = 0.0;
  ...
  return patrick;
}
  • 函数作用域
    仅用于goto语句的标签。这意味着即使一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数。

  • 函数原型作用域
    用于函数原型中的形参名(变量名)
    int mighty(int mouse, double large);
    函数原型作用域的范围是形参定义处到原型声明结束。这意味着,编译器在处理函数原型中的形参时只关心它的类型。而形参名(如果有的话)通常无关紧要。

  • 文件作用域
    定义在函数的外面的变量具有文件作用域,具有文件作用域的变量,从它的定义处到改定义所在文件的末尾均可见。
    所有文件作用域变量也称为全局变量。

链接

C变量有三种链接属性:外部链接、内部链接或无链接
具有块作用域、函数作用域或函数原型作用域的变量都是无链接变量。这意味这些变量术语定义他们的块、函数和原型私有。
具有文件作用域的变量可以是外部链接或内部链接。外部链接变量可以在多文件程序找使用,内部链接变量只能在一个翻译单元中使用。

C存储类

C程序中的存储类包括如下:

  • auto
  • register
  • static
  • extern

auto

{
  int mount;
  auto int month;
}

auto存储类是所有局部变量默认的存储类
auto 只能用在函数内,即 auto 只能修饰局部变量

register

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。

{
  register int miles;
}

寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义‘register’并不意味着变量将存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。

register变量必须是能被CPU寄存器所接受的类型。意味着register变量必须是一个单个的值,并且其长度应小于或等于整数的长度。

尽量在大量频繁的操作时使用寄存器变量,且声明的变量个数应该尽量的少

static

static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
static 是全局变量的默认存储类,以下两个变量 (count 和 road) 都有一个 static 存储类。

static int count;
int road;
main()
{
}

extern 存储类

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。

当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。

你可能感兴趣的:(C语言存储)