关于变量的生命周期与作用域及修饰词

变量分为全局变量和局部变量,那它们的作用域生命周期分别是什么呢?

作用域:作用域(scope)是程序设计概念,通常来讲,一段程序代码中所用到的名字并不总是有效/可用的,限定这个名字的可用性的代码范围就是这个名字的作用域

全局变量的作用域是整个工程;

局部变量的作用域是变量所在的局部范围

生命周期:变量的生命周期指的是变量的创建到变量的销毁的一个时间段。

全局变量的生命周期:整个程序的生命周期;

局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束;

register:代表寄存器变量;这个关键字请求编译器尽可能地将变量存在cpu内部的寄存器中,而不是通过内存寻址访问以提高效率。注意是尽可能,并不是绝对的。

寄存器其实就是一块一块小的存储空间,其存取速度比内存快得多;

static 可以修饰变量,函数;

static修饰变量:  变量分为局部变量和全局变量;但它们都存在于 静态区;

静态全局变量static修饰的全局变量 作用域 仅限于变量被定义的文件中,其他文件即使用 extern声明也无法使用它;

全局变量具有 外部链接属性,所以在其他源文件内部可以使用(正确使用),

OK,我们先看代码:

 我们发现,在不同的源文件中,即使名称相同的全局变量,并不能直接使用,所以我们需要加一个关键字 extern

 

 加了这个关键字 就可以正常使用这个全局变量了; OK 这时候又有一个问题,如下代码

OK,你会发现,我只是 将左侧的 int g_val 改成了 static int g_val,就导致右边源文件中的g_val成为了未定义的外部符号,这是为什么呢 ?这是因为,static修饰全局变量,会改变全局变量的链接属性,从外部链接属性变为内部链接属性 ,即这个全局变量的作用域发生改变,仅限于这个变量被定义的文件中,其他文件及使用extern声明也无法使用它

静态局部变量 static修饰的局部变量 ; 在函数体里面定义的,就只能在这个函数里面用了,同一个文档中的其他函数也用不了;static修饰的局部变量会使生命周期发生变化,但其作用域是不发生变化

可以看到 再没有使用static 时 a这个局部变量  的值一直为6;是因为 它的生命周期时在 从进入test开始,到出test就会被销毁(还给操作系统),并没有能达到累积的效果;而加了 static a的生命周期就发生了改变,他的生命周期变长,直到程序结束才会被销毁

 

你会发现,在没有进入static int a这条语句之前,这个a的地址就已经存在,且赋值为5;

这就说明这个 a 并不是在代码执行过程中创建的,而是在编译期间就已经分配好空间了;

 虽然这个a被 static 修饰 ,但他依然是一个局部变量,只不过它的生命周期变长罢了,从一个栈区上面的局部变量变为一个 静态区的局部变量,所以它只能在它所定义的函数里面使用;因此这里Test10()里面的 int c = a 会报错;

static修饰函数:static修饰函数和static修饰全局变量是非常类似的

 如你所看到的一样,右边的源文件无法调用左边的 Add函数,OK,猜你已经想到了,给左边函数加一个 extern 不就好了吗,OK,代码如下:

OK,看到了吗?是不是加了这个extern外部声明就可以正常使用了,OK,那接下来又有一个问题了 ,请看如下代码: 

我只给左边的Add函数加了一个static, 就导致了右边已经无法解析这个Add符号,说明static修饰函数的时候,会使这个函数的链接属性发生变化,从外部链接属性变为内部链接属性,即作用域发生了变化,这个Add函数只能在定义它的源文件中使用(又称之为内部函数);因此右边无法识别这个Add函数;

内部函数有一个好处就是 : 不同的人编写不同的函数时,不同担心自己定义的函数是否会与其他文件中的函数同名

其实呢,起初,在C中引入static关键字是为了 表示退出一个块后仍存在的局部变量,随后,static在C中又有了第二种含义,用来表示不能被其他文件访问的全局变量和函数。

const : const时constant的缩写,有恒定不变的意思,也会翻译为常量和常数等;但不幸的是,const修饰的值不是常量(在C语言中) , 其实const修饰的值为只读变量,它的值不能在编译时被使用。OK 用代码看看吧:

 根据编译器所报的错误信息,我们可以发现这个被const修饰的 a 绝对不是一个常量;其实const修饰的值是一个变量,只不过具有只读属性罢了;

OK那么又有一个问题,const修饰的只读变量必须在定义的时候初始化,是为什么 ?OK,代码如下:

 经过调试不难发现,此时被const修饰的 a的值为随机值,且由于const修饰的变量具有只读属性,所以不能更改,那这样这个a就失去了意义,因此,我们使用const修饰的只读变量必须在定义时初始化,否则没有价值。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值