全局变量、static 全局变量、局部变量、static 局部变量的理解(带实例)

全局变量、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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章