1、局部变量
一般指在函数中由{ }包括的代码块。它更多起分割作用,在这个代码块内部定义的变量就具有块作用域。例如函数内部的代码块或者像for循环、if语句等内部的代码块。虽然函数的形式参数声明在函数的左花括号之前,但也具有块作用域,属于函数体这个块。定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。
例如,
#include <stdio.h>
int fn(int a){
int b,c; //a,b,c仅在函数fn()内有效
return a+b+c;
}
int main(){
int m,n; //m,n仅在函数main()内有效
return 0;
}
2、全局变量
C语言中,全局作用域是指在整个程序(所有源文件)中都可见的标识符。全局作用域的变量和函数可以在任何源文件中被访问。全局变量具有这种作用域,其作用范围是整个源文件,从定义处开始一直到文件末尾都是可见的。并且全局变量的生命周期持续到程序结束。在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c
和 .h
文件。使用 static
可以限制全局变量的作用域,使其只在定义它的文件中可见,这样它就只具有文件作用域。
例如,
#include <stdio.h>
int a=3; //全局变量
static int b=4; // 当前源文件中可见
void fn(){
printf("%d\n %d\n",a,b);
}
int main(){
fn();
printf("%d\n %d\n",a,b);
return 0;
}
3、函数作用域
在函数内部定义的一些变量,只能在函数内部使用,一旦离开了这个函数就必须重定义。函数内部形成了一个独立的作用域区域,函数中的变量与外界是隔离的,外部无法直接访问函数内部定义的变量,函数内部也不能直接访问外部的变量(除非通过函数参数传递或者全局变量等方式)。
#include <stdio.h>
void function() {
int local_variable = 10;
// local_variable只能在function函数内部使用
printf("%d", local_variable);
}
int main() {
function();
// 这里不能直接访问local_variable
return 0;
}
4、文件作用域
文件作用域是指在一个源文件中定义的标识符(如变量或函数)在该文件的整个范围内有效。文件作用域的标识符只能在定义它的源文件中被访问,其他源文件无法直接引用。
#include <stdio.h>
// file1.c
int fileScopedVar = 10; // 文件作用域
void fn() {
printf("%d\n", fileScopedVar); // 可以访问
}
int main(){
fn();
printf("%d\n",fileScopedVar);
return 0;
}
5、局部变量与全局变量的区别
1)局部变量是声明在块或者函数内部的变量。局部变量的作用域局限于该块或者函数。局部变量如果没有初始化,将包含垃圾数据。
2)全局变量是在所有块和函数之前声明的变量。全局变量对所有在它之后声明的函数有效。全局变量有默认值初始化,如0
。
注意:如果要调用另外一个文件中的全局变量,如果再声明一个同名的全局变量,那么编译器会因为重名报错,此时就要使用extern
变量。extern
声明告诉编译器这个变量的定义在其他文件中,所以并不会为它分配内存。
// file1.c
#include <stdio.h>
int globalVar = 10; // 定义全局变量
void printGlobal() {
int localVar = 5; // 局部变量
printf("Inside function:\n");
printf("Local variable: %d\n", localVar); // 输出局部变量
printf("Global variable: %d\n", globalVar); // 输出全局变量
}
// file2.c
#include <stdio.h>
// 声明全局变量
// 使用 extern 关键字声明访问
// 其它文件中全局变量
extern int globalVar;
void modifyGlobal() {
globalVar += 5; // 修改全局变量
}
int main() {
// 输出全局变量
printf("Global variable: %d\n", globalVar);
// printf("Local variable: %d\n", localVar);
// 错误:localVar 不能在这里访问
printGlobal();
modifyGlobal();
printGlobal();
return 0;
}
6、全局作用域和文件作用域区别
文件作用域是相对于单个源文件而言的,而全局作用域则是整个程序的范围。文件作用域的标识符只能在定义它的源文件中被访问,其他源文件无法直接引用。全局作用域的标识符可以被多个源文件共享,前提是它们没有使用 static
关键字进行限制。
#include <stdio.h>
// 全局变量:全局作用域
int globalVar = 10; // 可以在任何文件中访问
// 文件作用域的变量:只在此文件中可见
static int fileScopedVar = 20; // 文件作用域
void function1() {
printf("In function1:\n");
printf("Global Variable: %d\n", globalVar); // 可以访问全局变量
printf("File Scoped Variable: %d\n", fileScopedVar); // 可以访问文件作用域变量
}
void function2() {
printf("In function2:\n");
printf("Global Variable: %d\n", globalVar); // 可以访问全局变量
// printf("File Scoped Variable: %d\n", fileScopedVar); // 不可访问,编译错误
}
int main() {
function1();
function2();
return 0;
}
7、静态局部变量和静态全局变量区别
1)静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
2)静态局部变量作用域仅限于定义它的函数,能够在多次函数调用之间保持状态。
#include <stdio.h>
// 静态全局变量
static int globalVar = 0; // 静态全局变量
void modifyGlobalVar() {
globalVar++;
printf("Global Variable: %d\n", globalVar);
}
void staticLocalVarExample() {
static int count = 0; // 静态局部变量
count++;
printf("Count: %d\n", count);
}
int main() {
// 调用静态局部变量示例
printf("Static Local Variable Example:\n");
for (int i = 0; i < 5; i++) {
staticLocalVarExample(); // 每次调用,count 保持其上次的值
}
// 调用静态全局变量示例
printf("\nStatic Global Variable Example:\n");
for (int i = 0; i < 2; i++) {
modifyGlobalVar(); // 输出全局变量的值
}
return 0;
}