全局变量、static 全局变量、局部变量的理解(带实例)
全局变量
在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 、.cpp、.h 文件。当一个cpp文件需要使用另一个cpp文件定义的全局变量,通过用extern声明,就可以从“声明”处起,合法地使用全局变量
全局变量全部存储在静态存储区。在程序开始执行过程中给全局变量分配空间,程序执行完毕就释放空间。程序执行过程中固定的分配空间,而不需要动态进行分配是释放。
static全局变量
全局变量前加static的作用是现在全局变量的作用范围,使该全局变量只在定义全局变量的源cpp文件中有效,其他源文件不能通过extern声明使用。
局部变量
定义在函数体、块作用域、内部的变量,作用域仅限于函数体内部、块作用域里,离开函数体、块作用域就会无效。局部变量与全局变量同名时,在该函数体内、块作用域里只会使用局部变量,自动隐藏全局变量。
程序在运行期间为局部变量动态地分配存储空间
static局部变量
静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在编译时赋初值,即只赋初值一次。在程序整个运行期间都不释放
代码
extern_1.h:
static int st1 = 0;//所有包含h的头文件可以被其他文件通过extern引用
extern_1.cpp:
#include<stdio.h>
#include"extern_1.h"
int test = 1;//全局变量,可以被其他.c、.cpp、.h文件通过extern引用
static int st2 = 0;//不!!可以被其他文件通过extern引用,static修\
饰的全局变量只在该extern_1.cpp文件有效,其他文件无效。
extern_2.cpp:
extern int test;
int test_static()
{
return test + 1;
}
main.cpp:
#include<stdio.h>
#include"extern_1.h"
#include<Windows.h>
extern int test;
//s1已经自然包含,因s1是定义在头文件中,通过#include"extern_1.h"已经包含
//extern int st2;
int f(void);
int main(int argc, char const *argv[])
{
//例1------------
//int test = 100;//新定义了一个局部变量,与全局变量同名,main函数里将覆盖全局变量,但是test并没作为参数传给f(),所以f()访问的还是全局变量
//printf("local test=%d\n", test);//
////例2------------
test = 100;//更改全局变量的值
printf("local test=%d\n", test);//
f();
f();
f();
system("pause");
}
int f(void)
{
static int all = 1;//static 局部变量
printf("all=%d\n", all);
all += 2;
printf("agn all=%d\n", all);
test++;//全局变量
printf("internal test=%d\n", test);
st1++;//s1为static全局变量,已经自然包含,因s1是定义在头文件中,通过#include"extern_1.h"已经包含
printf("static int st1=%d\n", st1);
return all;
}
输出结果
main函数里给了2个例子,注释掉例2,运行例1,结果输出如下:
main函数里注释掉例1,运行例2,结果输出如下:
注意,main函数里局部变量test与全局变量同名的输出有差异,static int st2在extern_2.cpp中不可见
参考
https://blog.csdn.net/u013355826/article/details/53224303/