C语言—再学习(数据的存储类别)
在c语言中,每个变量和函数都有两个属性:数据类型和数据的存储类别
C的存储类别包括4种:自动挡(auto)、静态的(static)、寄存器的(register)、外部的(extern)。
一、自动变量(auto变量)
定义和使用:在函数内部定义的变量默认是 auto 存储类别,也可以显式地使用 auto 关键字来声明。
作用域和生存期:自动变量的作用域仅限于定义它的函数或代码块,当函数执行结束时,自动变量的生存期结束,其所占用的内存被释放。也就是说,自动变量在函数调用时创建,函数返回时销毁。
二、静态局部变量(static局部变量)
局部静态变量:在函数内部使用 static 关键字声明的变量为局部静态变量。局部静态变量在程序运行期间只初始化一次,之后每次调用函数时,其值会保留上一次调用结束时的值
int func() {static int count = 0; // 局部静态变量count++;return count;
}
全局静态变量:在函数外部使用 static 关键字声明的变量为全局静态变量。全局静态变量的作用域仅限于定义它的文件,其他文件无法访问该变量。其生存期同样从程序开始运行到程序结束。
static int global_static_var = 10; // 全局静态变量int main() {// 在此处可以使用global_static_varreturn 0;
}
注:静态存储要多占内存(长期不释放),而降低了程序的可读性,调用次数过多往往弄不清当前值,因此非必要,不要多用。
三、寄存器变量(register 变量)
定义和使用:register 关键字用于建议编译器将变量存储在寄存器中,以提高访问速度。但编译器有最终决定权,不一定会将变量放入寄存器。
适用场景:通常适用于频繁使用的变量,如循环中的计数器等。但由于寄存器数量有限,且编译器会进行优化,实际应用中使用 register 关键字的情况相对较少。
四、外部存储类别(extern)
声明外部变量:当一个变量在一个源文件中定义,而在另一个源文件中使用时,可以使用 extern 关键字来声明该变量。例如,在 file1.c 中定义了一个变量:
// file1.c
int global_var = 10;
在 file2.c 中使用该变量:
// file2.c
extern int global_var; // 声明外部变量
int main() {// 可以在此处使用global_varreturn 0;
}
声明外部函数:extern 也可以用于声明外部函数,当一个函数在一个源文件中定义,而在另一个源文件中调用时,可以使用 extern 声明函数,虽然在实际应用中,函数声明时 extern 关键字常常省略,但原理上是使用了 extern 来声明外部函数。
// file1.c
int add(int a, int b) {return a + b;
}// file2.c
extern int add(int a, int b); // 声明外部函数
int main() {int result = add(3, 5);return 0;
}