C 语言存储类别

C语言中的每个变量都有两个属性:类型和存储类别。

类型指的是变量的数据类型。而存储类别决定了变量的作用域、可见性和生命周期。

存储类别有4种类型

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

局部变量

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

让我们举个例子。

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

运行上述程序时,您将收到一个错误 未声明的标识符 i。这是因为 ifor 循环块内声明。在该块之外,它是未声明的。

让我们看另一个例子。


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 <stdio.h>
void display();

int n = 5;  // global variable

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

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

输出

n = 7

假设全局变量在 file1 中声明。如果您尝试在不同的文件 file2 中使用该变量,编译器会报错。为了解决这个问题,在 file2 中使用关键字 extern 来指示外部变量是在另一个文件中声明的。


寄存器变量

register 关键字用于声明寄存器变量。寄存器变量原本被认为比局部变量更快。

然而,现代编译器在代码优化方面做得非常好,使用寄存器变量很少能让您的程序运行得更快。

除非您正在处理嵌入式系统,并且知道如何为给定应用程序优化代码,否则寄存器变量没有用处。


静态变量

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

static int i;

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


示例2:静态变量

#include <stdio.h>
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,并显示在屏幕上。

视频:C语言变量作用域

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战