C语言中的静态变量



默认情况下,C 变量 被归类为自动存储类型。当您希望在对不同函数的调用之间保留某个值时,静态变量很有用。静态变量也用于存储应在多个函数之间共享的数据。

静态变量

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

静态变量的特性

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

  • 编译器在计算机的主内存中为静态变量分配空间。
  • 与 auto 不同,静态变量初始化为零而不是垃圾值。
  • 如果静态变量在函数内部声明,则在每次函数调用时都不会重新初始化。
  • 静态变量具有局部作用域。

声明静态变量

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

static datatype var = value;

这里,

  • 数据类型表示变量的类型,如 int、char、float 等。
  • 变量是用户给定的变量名。
  • 是赋予变量的任何值。默认为零。

C语言中静态变量的示例

示例:使用静态变量

以下是如何在 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

示例:创建不使用静态变量的计数器函数

在此示例中,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”。在每次后续调用中,它不会被重新初始化。相反,它保留了之前的值。

示例:使用静态变量创建计数器

将“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

将静态变量传递给函数

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

示例

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

#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

静态变量和全局变量之间的相似之处

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

静态变量的作用域仅限于其声明的函数或块。这与全局变量不同,全局变量可以在整个程序中访问。此外,静态变量可以导入到另一个代码文件中,就像我们使用extern关键字一样。

示例

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

#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)。

广告