Menu Close

存储类 auto, extern, static, register

1.什么是C语言的存储类?

C 编程中的每个变量都有两个属性:类型和存储类。

类型是指变量的数据类型。而存储类决定了变量的范围、可见性和生命周期。它告诉我们可以从代码的哪一部分访问变量。

存储类用于描述以下内容:

  • 可变范围;
  • 变量将被存储的位置;
  • 变量的初始化值;
  • 变量的生命周期;
  • 谁可以访问变量?

因此,存储类用于表示所有有关变量的信息。

注意:变量不仅与数据类型,变量值相关联,而且也和存储类关联。

共有四种类型的标准存储类别。 下表代表“ C”中的存储类别

存储类 auto, extern, static, register
存储类 auto, extern, static, register

2. auto存储类

使用auto存储类定义的变量称为局部变量。 auto代表自动存储类别。 如果未明确指定变量的存储类,则默认情况下该变量是auto存储类。

自动变量的范围仅受特定块限制。 一旦控制流退出该块,访问将被破坏。 这意味着只有声明了auto变量的块才能访问它。

关键字auto用于定义自动存储类。 如果你不赋予变量值,默认情况下,自动变量包含的值是垃圾值。

你可以看下面例子,每个块内的auto变量值是不一样的。离开了该块,变量自动失效。

例1.auto存储类

#include <stdio.h>
int main( )
{
  auto int j = 1;
  {
    auto int j= 2;
    {
      auto int j = 3;
      printf ( " %d ", j);
    }
    printf ( "\t %d ",j);
  }
  printf( "%d\n", j);
}

例2.无定义变量出现错误

  #include <stdio.h>

int main(void) {
  
  for (int i = 0; i < 5; ++i) {
     printf("C programming");
  }
  
 // Error: i is not declared at this point
  printf("%d", i);  
  return 0;
}

当你运行上面的程序时,你会得到一个错误 undeclared identifier i。这是因为 i 是在 for 循环块内声明的。在块之外,它是未声明的。

3. Extern存储类

Extern代表外部存储类。 当我们具有在两个或更多文件之间共享全局函数或变量时,将使用外部存储类。全局变量对所有的程序文件都是可见的, Extern用于当有两个或多个文件共享相同的全局变量或函数的时候。

关键字extern用于声明另一个文件中的全局变量或函数,以引用已在原始文件中定义的变量或函数。使用extern关键字定义的变量称为全局变量。 在整个程序中都可以访问这些变量。 请注意,extern变量无法初始化,它已经在原始文件中定义了

举例说明如何声明全局变量,并运行大型C项目。

例3.关键字extern的应用

第一个文件: main.c

#include <stdio.h>
extern i;
main()
{
   printf("value of the external integer is = %d\n", i);
   return 0;
}

第二个文件: original.c

#include <stdio.h>
i=48;

你可以通过下列步骤运行以上程序。这个步骤可以告诉你大型C语言程序怎么运行的。

第一步) Create new project,

选择 Console Application
点击 Go

第二步) 选择 C 并点击 Next

第三步) 点击 Next

第四步)进入文件夹和项目名,然后点击 Next

第五步) 点击 Finish

第六步) 双击main.c把 main 程序放在 main.c 文件,

第七步) 产生一个新文件 [File -> new -> Empty File , 另存为 original.c , 点击 对话框的”OK” ,把该文件加到现在 project (项目)。

第八步) 把上面 original.c 文件里面的程序放入 该 original.c

第九步) save并运行

可以看出,运行结果。main函数引用了ertern 全局变量i。

4. Static 存储类

静态变量在函数/文件中用作局部静态变量。 它们也可以用作全局变量。

静态局部变量是一种局部变量,它在函数调用或块之间保留并存储其值,并且仅对定义该变量的函数或块可见。

静态全局变量是仅对声明它的文件可见的全局变量。

static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。

因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

请记住,静态变量的默认初始值为零,并且在其生命周期内仅初始化一次。

例4.静态变量的应用

 #include <stdio.h> 
 
/* function declaration */
void next(void);
static int counter = 7; /* global variable */
 
main() 
{
   while(counter<span style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" data-mce-type="bookmark" class="mce_SELRES_start"></span><10) 
   {
      next();
      counter++;   
   }
   return 0;
}
 
void next( void )   /* function definition */
{   
   static int iteration = 13; /* local static variable */
   iteration ++;
   printf("iteration=%d and counter= %d\n", iteration, counter);
} 

全局变量可在整个文件中访问,而静态变量仅可用于声明该变量的特定部分。静态变量的寿命位于整个程序代码中。

 

5.register 存储类

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这样运算速度会很快。因为CPU会很快找到该变量。

READ  C语言的编译链接过程

它类似于auto存储类, 该变量仅限于特定块。 唯一的区别是使用register存储类声明的变量存储在CPU寄存器中而不是内存中。 寄存器具有比主存储器更快的访问权限。

使用register存储类声明的变量没有默认值。 该变量通常在程序开始时声明。一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量.

例5.register变量的应用

#include <stdio.h>
main() 
   {
     {
       register int  weight;
       int *ptr=&weight ; /*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/
      }
   }

变量的最大尺寸等于寄存器的大小,且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)


register 关键字用于声明寄存器变量。寄存器变量应该比局部变量快。

但是,现代编译器非常擅长代码优化,使用寄存器变量使您的程序更快的机会很少。

除非您在嵌入式系统上工作,您知道如何为给定的应用程序优化代码,否则不会使用寄存器变量。

6.存储类总结

  • 下表总结了C编程中常用的每个存储类的主要功能


    摘要

  • 存储类用于表示有关变量的其他信息;
  • 存储类表示变量的范围和寿命;
  • 它还告诉谁可以访问变量和从哪里访问变量;
  • 自动,外部,寄存器,静态是“ C”中的四个存储类;
  • auto用于块或函数中定义的局部变量;
  • register于将变量存储在CPU寄存器中,而不是内存位置;
  • 静态用于全局变量和局部变量;
  • Extern用于C项目文件之间的数据共享;
  • 一个项目可以包含很多文件
除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!

Posted in C语言教程

Related Posts