在本教程中,您将了解局部和全局变量的范围和生存期。 此外,您还将学习静态和寄存器变量。
C 编程中的每个变量都有两个属性:类型和存储类。
类型是指变量的数据类型。 并且,存储类确定变量的范围,可见性和生存期。
有四种类型的存储类别:
- 自动
- 外部
- 静态
- 寄存器
局部变量
在块内声明的变量是自动变量或局部变量。 局部变量仅存在于声明它的块内部。
让我们举个例子。
#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
。 这是因为i
在for
循环块内声明。 在该块之外,未声明。
让我们再举一个例子。
int main() {
int n1; // n1 is a local variable to main()
}
void func() {
int n2; // n2 is a local variable to func()
}
在以上示例中,n1
对于main()
是本地的,n2
对于func()
是本地的。
这意味着您无法访问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,并打印在屏幕上。