C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部对象是指定义在函数内部的函数参数及变量。

外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。

由于C语言代码是以文件为单位来组织的,在一个源程序所有源文件中,一个外部变量或函数只能在某个文件中定义一次,而其它文件可以通过extern声明来访问它(定义外部变量或函数的源文件中也可以包含对该外部变量的extern声明)。

而static则可以限定变量或函数为静态存储:

如果用static限定外部变量与函数,则可以将该对象的作用域限定为被编译源文件的内部。通过static限定外部对象,可以达到隐藏外部对象的目的。因而,static限定的变量或函数不会和同一程序中其它文件中同名的相冲突。

如果用static限定内部变量,则该变量从程序一开始就拥有内存,不会随其所在函数的调用和退出而分配和消失。

C语言使用静态函数的好处:

1. 静态函数会被自动分配在一个一直使用的存储区域,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。

2. 关键字“static”,翻译成中文就是“静态的”,所以内部函数又称为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数是否会与其它文件中的函数同名。因为这时同名了也没关系。

c语言中static的语义

1.static变量:

  1. 1).局部
  • a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。
  • b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
  1. 2).全局
  • 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。

2.static函数(也叫内部函数):

只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数)
static在c里面可以用来修饰变量,也可以用来修饰函数。
先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。

int a ;
main()
{
int b ;
int c* = (int *)malloc(sizeof(int));
}

a是全局变量,b是栈变量,c是堆变量。

static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的工程是由好多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。
static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。但加入static修饰之后,变量已经不在存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。
static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。
static 声明的变量在C语言中有两方面的特征:
  1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
  2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

通过上面的分析,我们不难得出以下结论:

1、 静态函数与普通函数的区别在于:静态函数不可以被同一源文件以外的函数调用。

2、 静态局部变量与普通局部变量的区别在于:静态局部变量只初始化一次,下一次初始化实际上是依然是上一次的变量;

3、 静态全局变量与普通全局变量的区别在于:静态全局变量的作用域仅限于所在的源文件。

最新文章

  1. tp5 model 中的类型转换
  2. iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
  3. 嵌入式Linux驱动学习之路(十六)输入子系统
  4. CodeForces 716B Complete the Word
  5. C语言实现二叉树-04版
  6. Navi.Soft20.WinCE使用手册
  7. Jsp入门学习笔记
  8. 与PostgreSQL相关的工具
  9. hadoop启动后jps 没有namenode
  10. C#如何以管理员身份运行程序(转)
  11. MVC 学习随笔(一)
  12. Windows Form简易计算器实现(下)
  13. Linux 查硬件配置
  14. C# 封装miniblink 使用HTML/CSS/JS来构建.Net 应用程序界面和简易浏览器
  15. 使用json-Server与postman快速模拟服务环境搭建
  16. 利用cocoapods管理开源项目,支持 pod install安装整个流程记录(github公有库)
  17. Stm32型号查阅手册
  18. 前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
  19. centos 7 搭建openvpn-2.4.6
  20. css实现图片垂直居中

热门文章

  1. 解析Xml四种方法
  2. <audio>使用2
  3. PHP学习笔记十三【二维数组】
  4. Mac系统杂项 (持续更新)
  5. MYSQL SET类型字段的SQL查询某个字段保函某个值的查询
  6. ssh username@10.2.1.23无法连接
  7. python运维开发(十二)----rabbitMQ、pymysql、SQLAlchemy
  8. Leetcode 242 Valid Anagram pytyhon
  9. SQL Server 查看数据库空间分配情况的 2 种方法
  10. 什麼是 N-key 與按鍵衝突?原理說明、改善技術、選購注意完全解析