static--修饰(局部变量、全局变量、函数)

在我们刚开始接触接触C语言的时候一定听说过static关键字,在刚开始学习C语言的时候相信很多人都会对static感到记忆深刻,刚开始学的时候我也一脸懵逼,现在觉得时候做一个归纳整理了。static的用法也就下面几点,
1):static修饰局部变量
2):static修饰全局变量
3):static修饰函数

一、static修饰局部变量

普通的局部变量是在栈上进行分配的,局部变量所处的函数被多次调用时每次调用的位置都不一样的。局部变量也可以在堆上进行动态的分配,但须记得释放空间。
静态局部变量和普通局部变量区别如下:
访问权限:静态局部变量只能被其作用域内的变量和函数进行访问使用,它虽然存在与程序的整个生命周期,但由于是static的所以不能被其他函数和源文件访问。
作用位置:静态局部变量被编译器存放在全局存储区(data),所以它虽然是局部的但是却存在与整个生命周期。
值:静态的局部变量如果没有被初始化,会自动被编译器赋值为0,以后每次调用静态局部变量就都会用上次调用的值(每次函数调用静态局部变量都修改它然后离开,下次读的时候从全局存储区读的静态局部变量就是上次修改后的值)。
注意:
由于函数的每次调用,普通的局部变量都会重新分配,而静态局部变量会保持上次调用的值不变。正是由于static局部变量的这种特性,使得静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果,这在多线程编程时可能会成为一种隐患。

二、static修饰全局变量

说到静态局部变量我们先来看看一个进程在内存中的布局:
这里写图片描述
.text段(文本段)保存的是进程所执行的二进制文件,.data段(数据段)保存进程已经初始化的全局变量,.bss段保存进程未初始化的全局变量。在进程的整个生命周期中,.data段和.bss段内的数据是根整个进程同生共死的,也就是在进程结束之后这些数据才会寿终正寝。当一个进程的全局变量被声明为static之后,静态全局变量和其他全局变量在存储位置并没有区别,都是在.data段(已初始化)和.bss段(未初始化区),但它只在定义它的源文件内是有效的,在同一 程序的其他源文件内是不可见的,这就是静态全局变量和普通全局变量的区别。

对static修饰的局部变量和全局变量还有疑问的话,可参照我的另一篇博客将静态局部变量,静态全局变量、局部变量、全局变量做的有详细的说明:
局部变量、全局变量、静态局部变量、静态全局变量
(点击可查看)。

三、static修饰函数

当一个程序中有很多源文件的时候,每个源文件可能会提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写的,这些函数可能不希望被外界所看见就用static来修饰这个函数,这就是静态函数。静态函数有些类似与C++里面private函数。
static函数可以很好的解决不同原文件中函数同名的问题,因为一个源文件中的static函数对其他文件来说是不可见的。

tatic函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
static函数在内存中只有一份,普通函数在每个调用中都有一份拷贝。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值