1. 局部变量

局部变量是指在代码块局部定义的变量,只能在对应的代码块中使用。离开了这个代码块范围就不允许再被使用。因为在数据存储时局部变量将会被储存在栈中,如同函数一样,使用完后会被销毁,而在声明变量时使用auto,但是一边由于程序默认为auto所以一般省略不写。

总的来说

局部变量:在函数内部定义的变量

作用域:函数内部。

生命周期:从变量创建到函数结束。

示例1:

1
2
3
4
5
6
7
8
9
10
11
int main()
{
auto int a = 0;
printf("%d\n",a);
return 0;
}

void str()
{
printf("%d",a);
}

上述代码中,我们定义了一个名字为a的整形变量(auto可以省略不写),这里的变量a只能在main中使用,并且作用范围在定义了a直到main函数的结束。在第二个函数 text中,无法引用。如图:

image-20231116160913307

那么我们常用的for函数也是如此,如图:

image-20231116160943406

显然我们看到,当i在for循环之外时已经无法使用,但是如果我们想让i也能使用时,那么我们可以如下方式写:

1
2
3
4
5
6
7
8
9
10
11
12
int main() {
int a;
printf("%d\n", a);
int i;
for (i = 0; i <= 5; i++)
{
printf("&d\n", i);
}
printf("%d\n",i);

system("pause");
return 0;

这样将i定义在main这个大范围的函数中就可以在for值直接调用i,并且对它做出了修改。

2. 全局变量

全局变量是指可以在同一个文件或项目文件夹中都可以调用的变量。它可以使得我们所有的文件或者函数可以通用一个变量。==但是当其他同项目文件的的文件需要使用时必须对它声明,用extern==,并且全局变量定义时可以不用赋值,系统会自动赋值为0。有此特性我们可以得出全局变量是储存在数据区没有栈区

总的来说

全局变量:在函数外部定义的变量

作用域:在整个项目文件夹

生命周期:从程序开始到结束

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void text();

int a;

int main()
{
printf("%d\n",a);
text();
return 0;
}
void text ()
{
printf("%d\n",a);
}

我们看看输出结果

image-20231116162228718

上述就是一个很经典的全局变量。那么如果全局变量定义后又在局部定义一个同名变量该怎么办呢,看看如下示例:

1
2
3
4
5
6
7
8
int a=2;

int main()
{
int a=10;
printf("%d\n",a);
return 0;
}

结果如下:

image-20231116164452444

我们发现,这里不仅重复定义a没有报错,还将局部变量的a覆盖了全局变量的a,遵循着就近原则。我们再举一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
int a=2;

int main()
{
int a = 10;
printf("%d\n", a);
{
int a=12;
printf("%d\n",a);
}
printf("%d\n", a);
return 0;
}

输出结果为

image-20231116165329383

上述代码中,我们可以看到我们再函数体中又添加了一个大括号,里面写了些内容,这个叫做匿名内部函数,在执行完后内部数据也会被销毁。所以可知,内部函数不影响全局变量的值,全局函数也是如此,变化的值只适用于局部。


3. 静态变量

静态变量不同的是其数据储存方式和使用,局部静态变量和全局静态变量的生命周期都是由创建到程序结束为止,在局部静态变量中如果未赋值,则系统将会自动赋值为0,而全局静态变量的作用域也发生了改变。总的来说如下:

静态局部变量:在函数体中只会定义一次,可以对变量多次赋值。

作用域:函数体内

生命周期:从创建到程序结束。

静态全局变量:

作用域:只能在本文件中调用,不再支持对同项目文件调用。

生命周期:从创建到函数结束

静态变量定义方式:

静态局部:

1
2
3
4
5
6
7
8
9
10
11
12
13
void text ()
{
static int a;
printf("%d\n",a);
a++;
}

int main()
{
text();
text();
return 0;
}

输出结果为

image-20231116170803564

这里我们将text执行了两次发现a并没有被销毁,而是被保留,并且没有被重新赋值。

4. 全局函数和静态函数

所有的函数在默认情况下都是全局函数,可以供整个项目文件调用,而静态函数则是用static所定义的,与全局函数不同的是,静态函数的作用域变为仅供本体文件内部调用,无法由其他文件调用,而全局函数中整个项目文件夹中不能出现同名的函数,而静态函数允许不同文件定义相同名字的函数,静态函数也遵循就近原则,有限调用本文件的函数。


资料参考

b站的黑马程序员