关键字static、extern+全局变量与局部变量详解

关键字static、extern+全局变量与局部变量详解,第1张

目录

前言


一、简单介绍全局与局部变量


二、关键字+全局与局部变量详解

1.关键字static+修饰局部变量

2.关键字extern+修饰全局变量

3.static修饰函数 

总结


前言

C语言中所有的变量都有自己的作用域。


C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。


在学习全局变量与局部变量前,首先我们要先了解关键字 staticextern(下面我会详细介绍)

一入编程深似海,从此长发是路人......


一、简单介绍全局与局部变量

简单的一句话,在{}里面定义的变量都为局部变量,在{}外面定义的变量都为全局变量

#include 
int b = 10; //b定义为全局变量
int main()
{
	int i = 0;//i定义为全局变量
	return 0;
}

二、关键字+全局与局部变量详解

在C语言中,关键字是C语言给我们的,自己不能创建!!!

static是用来修饰变量和函数的:

1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数

1.关键字static+修饰局部变量

下面代码示例:

//代码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。


第一张代码图运行解析(有static修饰时):当有static修饰时,static修饰局部变量就会改变变量的生命周期,test()中i的值出了test()这段程序代码是不会销毁的,i 的值是会逐渐增加的,静态变量出了作用域依然还存在,直到程序结束,生命周期才结束

2.关键字extern+修饰全局变量

下面代码实例:

//代码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修饰后,就成了内部链接属性,只能在自己所在的源文件里使用,不能在其他文件里使用,使用上是作用域变小了,所以就会出现无法解析的外部符号。


 

extern是C语言关键字,是用来声明外部符号的。


                                                                 

如果一个工程由多个源文件组成,在一个源文件中想引用另一个源文件中已定义的外部变量,就需要在引用变量的源文件中用extern关键字声明变量。


3.static修饰函数 

下面代码示例:

//代码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修饰全局变量有着异曲同工之妙,可照着葫芦画瓢,这里就不做展示亲们可以尝试做一下。



总结

全局静态变量
优点:不管对象方法还是类方法都可以访问和修改全局静态变量,并且外部类无法调用静态变量,定义后只会指向固定的指针地址,供所有对象使用,节省空间。



缺点:存在的生命周期长,从定义直到程序结束。



局部静态变量
优点:定义后只会存在一份值,每次调用都是使用的同一个对象内存地址的值,并没有重新创建,节省空间,只能在该局部代码块中使用。



缺点:存在的生命周期长,从定义直到程序结束,只能在该局部代码块中使用。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/577979.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存