目录
前言
一、简单介绍全局与局部变量
二、关键字+全局与局部变量详解
1.关键字static+修饰局部变量
2.关键字extern+修饰全局变量
3.static修饰函数
总结
前言
C语言中所有的变量都有自己的作用域。
C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。
在学习全局变量与局部变量前,首先我们要先了解关键字 static和extern(下面我会详细介绍)
一入编程深似海,从此长发是路人......
一、简单介绍全局与局部变量
简单的一句话,在{}里面定义的变量都为局部变量,在{}外面定义的变量都为全局变量
#include
int b = 10; //b定义为全局变量
int main()
{
int i = 0;//i定义为全局变量
return 0;
}
二、关键字+全局与局部变量详解
在C语言中,关键字是C语言给我们的,自己不能创建!!!
1.关键字static+修饰局部变量static是用来修饰变量和函数的:
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
下面代码示例:
//代码1(没有任何的修饰)
#include
void test()
{
static int i=0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
运行后的代码示例(有无static修饰对比):
由以上可知,当代码有无static修饰的时候,运行的结果是不一样的...
第一张代码图运行解析(无static修饰时):我们都知道代码执行是从上往下编译执行的,编译到for循环时,即进入到自定义函数test(),test()是独立的一段程序代码,当一段程序代码执行完成后,我们的数据都会销毁,不会在存储,这也就导致了第二次访问test()时,i 的值还是等于0;所以程序的运行结构就会出现循环,一直为1。
2.关键字extern+修饰全局变量第一张代码图运行解析(有static修饰时):当有static修饰时,static修饰局部变量就会改变变量的生命周期,test()中i的值出了test()这段程序代码是不会销毁的,i 的值是会逐渐增加的,静态变量出了作用域依然还存在,直到程序结束,生命周期才结束
下面代码实例:
//代码1
//test1.c(创建的另一个源文件)
int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
//代码2
//test1.c(创建的另一个源文件)
static int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
运行后的代码示例(无static修饰):
运行后的代码示例(有static修饰):
由以上可知,当代码有无static修饰的时候,运行的结果是不一样的...
第一张代码图运行解析(无static修饰时):由上可以知道一个全局变量是有外部链接属性的,在不同的源文件下都能被使用,在使用时需要关键字extern声明才能使用
第二张代码图运行解析(有static修饰时):一个全局变量本来是由外部链接属性的,被static修饰后,就成了内部链接属性,只能在自己所在的源文件里使用,不能在其他文件里使用,使用上是作用域变小了,所以就会出现无法解析的外部符号。
3.static修饰函数extern是C语言关键字,是用来声明外部符号的。
如果一个工程由多个源文件组成,在一个源文件中想引用另一个源文件中已定义的外部变量,就需要在引用变量的源文件中用extern关键字声明变量。
下面代码示例:
//代码1
//add.c
int Add(int x, int y)
{
return x+y;
}
//test.c
extern int Add(int x,int y);//声明外部符号
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
//代码2
//add.c
static int Add(int x, int y)
{
return x + y;
}
//test.c
extern int Add(int x,int y);//声明外部符号
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
static修饰函数的原理与static修饰全局变量有着异曲同工之妙,可照着葫芦画瓢,这里就不做展示亲们可以尝试做一下。
总结
全局静态变量
优点:不管对象方法还是类方法都可以访问和修改全局静态变量,并且外部类无法调用静态变量,定义后只会指向固定的指针地址,供所有对象使用,节省空间。
缺点:存在的生命周期长,从定义直到程序结束。
局部静态变量
优点:定义后只会存在一份值,每次调用都是使用的同一个对象内存地址的值,并没有重新创建,节省空间,只能在该局部代码块中使用。
缺点:存在的生命周期长,从定义直到程序结束,只能在该局部代码块中使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)