Cprogramming 简明教程

Static Variables in C

默认情况下, C variable 被归类为 auto storage type 。静态变量可用于在调用不同函数之间保留某个值。静态变量还用于存储应该在多个函数之间共享的数据。

Static Variables

static variables 属于静态存储类,它们只被初始化一次并且保留值直到程序结束, static 关键字用于声明静态变量。

Features of Static Variables

以下是 C 编程语言中静态变量的一些特性 −

  1. 编译器在计算机的主内存中为静态变量分配空间。

  2. 与 auto 不同,静态变量初始化为 0 而不是垃圾。

  3. 如果静态变量是在函数内声明的,那么在每次函数调用时都不会对其重新初始化。

  4. 静态变量具有局部作用域。

Declare a Static Variable

要在 C 语言中声明一个静态变量,请使用 static 关键字并赋予初始值。以下是声明静态变量的语法:

static datatype var = value;

Here

  1. datatype 表示变量的类型,如 int、char、float 等。

  2. var 是用户给定的变量名称。

  3. value 是赋予给变量以进行初始化的任何值。默认情况下,它为零。

Examples of Static Variables in C

Example: Using Static Variable

下面是您如何在 C 语言中使用静态变量的一个示例 −

#include <stdio.h>

int main(){

   auto int a = -28;
   static int b = 8;

   printf("The value of auto variable: %d\n", a);
   printf("The value of static variable b: %d\n",b);

   if(a != 0)
      printf("The sum of static variable and auto variable: %d\n",(b+a));

   return 0;
}

当你运行这段代码时,它将产生以下输出:

The value of auto variable: -28
The value of static variable b: 8
The sum of static variable and auto variable: -20

Example: Create Counter Function W/O Using Static Variable

在这个示例中, x 默认情况下是一个自动变量,并在每次调用 counter() 函数时初始化为 0。在每次后续调用中,它都会重新初始化。

#include <stdio.h>

int counter();

int main(){
   counter();
   counter();
   counter();
   return 0;
}

int counter(){
   int x;
   printf("Value of x as it enters the function: %d\n", x);
   x++;
   printf("Incremented value of x: %d\n", x);
}

运行代码并检查其输出:

Value of x as it enters the function: 0
Incremented value of x: 1
Value of x as it enters the function: 0
Incremented value of x: 1
Value of x as it enters the function: 0
Incremented value of x: 1

然而,当 counter() 函数中的变量 x 声明为 static 时,它会在首次调用 counter() 函数时初始化为“0”。在每次后续调用中,它不会重新初始化。相反,它会保留较早的值。

Example: Create Counter Using Static Variable

将“x”的声明更改为“static int x = 0;”并再次运行该程序 −

#include <stdio.h>

int counter();

int main(){
   counter();
   counter();
   counter();
   return 0;
}

int counter(){
   static int x = 0;
   printf("Value of x as it enters the function: %d\n", x);
   x++;
   printf("Incremented value of x: %d\n", x);
}

现在,当您运行这段代码时,它将生成以下输出 −

Value of x as it enters the function: 0
Incremented value of x: 1
Value of x as it enters the function: 1
Incremented value of x: 2
Value of x as it enters the function: 2
Incremented value of x: 3

Passing Static Variable to Function

您可以将静态变量传递给函数。但是,形式参数不能声明为静态,因为 C 将函数参数用作函数内部的局部自动变量。

Example

在此代码中,我们向 function 传递了一个静态变量。但是,其值的变化不会反映在调用函数中。

#include <stdio.h>

int myfunction(int x);

int main(){

   static int x = 5;
   myfunction(x);
   printf("in main - x:%d\n", x);

   return 0;
}

int myfunction(int x){
   x++;
   printf("Incremented value of x: %d\n", x);
}

运行该代码并检查其输出 −

Incremented value of x: 6
in main - x:5

Similarities Between Static and Global Variables

静态变量与 global variable 有一些相似之处。如果两者均未显式初始化,则两者都初始化为“0”(对于数字类型)或“空指针”(对于 pointers )。

静态变量的范围局限于在其中声明的函数或块中。这不同于全局变量,全局变量可在整个程序中访问。此外,还可以使用 extern 关键字在另一个代码文件中导入静态变量。

Example

您也可以将全局变量声明为静态。请查看以下示例 −

#include <stdio.h>

int myfunction();

static int x = 5;

int main(){
   myfunction(x);
   printf("Inside the main function, x: %d\n", x);
   return 0;
}

int myfunction(){
   x++;
   printf("Incremented value of x: %d\n", x);
}

当你运行这段代码时,它将产生以下输出:

Incremented value of x: 6
Inside the main function, x: 6

最好使用静态变量仅在文件中访问。另一方面,使用全局(使用 extern )变量从程序中的任何位置进行访问(如果在其他文件中声明 extern )。