📜  C存储类

📅  最后修改于: 2020-10-04 12:25:26             🧑  作者: Mango

在本教程中,您将了解局部和全局变量的范围和生存期。此外,您还将学习静态和寄存器变量。

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

类型是指变量的数据类型。并且,存储类确定变量的范围,可见性和生存期。

有四种类型的存储类别:

  1. 自动
  2. 外部
  3. 静态的
  4. 寄存器

局部变量

在块内声明的变量是自动变量或局部变量。局部变量仅存在于声明它的块内。

让我们举个例子。

#include 

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;
}

当您运行上述程序时,您将得到一个错误的未声明的标识符i 。这是因为for循环块中声明了。在该块之外,未声明。

让我们再举一个例子。

int main() {
    int n1; // n1 is a local variable to main()
}

void func() {
   int n2;  // n2 is a local variable to func()
}

在上面的示例中, n1main()本地, n2func()本地。

这意味着您不能访问func()内部的n1变量,因为它仅存在于main()内部。同样,您无法访问main()n2变量,因为它仅存在于func()内部。


全局变量

在所有函数外部声明的变量称为外部或全局变量。可以从程序内的任何函数访问它们。


示例1:全局变量

#include 
void display();

int n = 5;  // global variable

int main()
{
    ++n;     
    display();
    return 0;
}

void display()
{
    ++n;   
    printf("n = %d", n);
}

输出

n = 7

假设在file1声明了一个全局变量。如果您尝试在其他文件file2使用该变量,则编译器会抱怨。为了解决这个问题,关键字extern在使用file2 ,表明外部变量是在另一个文件中声明。


注册变量

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

但是,现代的编译器非常擅长代码优化,使用寄存器变量使程序运行更快的可能性很小。

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


静态变量

使用static关键字声明静态变量。例如;

static int i;

静态变量的值会一直保留到程序结束。


示例2:静态变量

#include 
void display();

int main()
{
    display();
    display();
}
void display()
{
    static int c = 1;
    c += 5;
    printf("%d  ",c);
}

输出

6 11

在第一个函数调用期间, c的值初始化为1。其值增加5。现在, c的值为6,将其显示在屏幕上。

在第二个函数调用期间, c不会再次初始化为1。这是因为c是静态变量。值c增加5。现在,它的值将是11,将其打印在屏幕上。