C 存储类
C 存储类
在本教程中,您将了解局部和全局变量的范围和生命周期。此外,您还将了解静态变量和寄存器变量。
C编程中的每个变量都有两个属性:类型和存储类。
类型是指变量的数据类型。而且,存储类决定了变量的范围、可见性和生命周期。
存储类有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;
}
当你运行上面的程序,你会得到一个错误
undeclared identifier 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()
本地的 .
这意味着您无法访问 n1 func()
内的变量 因为它只存在于 main()
.同样,您无法访问 n2 main()
内的变量 因为它只存在于 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
中使用该变量 ,编译器会抱怨。为了解决这个问题,关键字extern
用于file2
表示外部变量是在另一个文件中声明的。
注册变量
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语言