yuedx的个人空间 https://blog.eetop.cn/317611 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

static有什么用途?

已有 419 次阅读| 2009-3-26 16:01 |个人分类:C/C++程序设计

【题目】static有什么用途?

 

在网上流传很广的一个答案是:

1、限制变量的作用域

2、设置变量的存储域

    我觉得这样答题是不妥当的,有点文不对题的感觉。

 

下面是我给出的答案:

static 类型声明符在C语言里面主要有三个用途:

<!--[if !supportLists]-->1、<!--[endif]-->声明静态局部变量。

<!--[if !supportLists]-->2、<!--[endif]-->声明静态外部全局变量。

<!--[if !supportLists]-->3、<!--[endif]-->声明静态外部函数。

 

下面是我整理的有关上面三个用法的解释说明。另外网友xiaocai0001的《static用法小结》一文有更详细的解释,请参考。

http://blog.csdn.net/xiaocai0001/archive/2006/04/14/662921.aspx

静态局部变量(与auto对比)

<!--[if !supportLists]-->1、  <!--[endif]-->存储空间分配、作用域和生存期

static分配在静态存储区,作用域仅仅限于声明该变量的函数内部。在程序

整个运行期间都不释放,生存期贯穿于程序运行的整个过程。

auto类型分配在栈上,属于动态存储类别,占动态存储区空间,作用域仅仅限于声明该变量的函数内部。函数调用结束后自动释放,生存期不过是在声明该变量的函数内部。

2、赋初值时的处理方式

static静态局部变量在编译时赋初值,即只赋初值一次;

auto自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

3、未赋初值时的处理方式

如果在定义局部变量时不赋初值的话:

static静态局部变量,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。

auto自动变量,如果不赋初值则它的值是一个不确定的值。

 

静态外部全局变量

C语言中static还用来声明静态外部全局变量,那么这个全局变量的作用域就被限制在本文件内部。

外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

而如果我们声明的全局变量不想被其他文件访问和使用又该怎么办?

那就是在声明的时候前面加上关键字static

 

静态外部函数

 

C语言中我们的函数默认都是全局的,也就是说你可以调用其他文件中的函数。在使用的时候,我们象前面一样在头文件中加上extern就可以了。但是有时候我们写的函数并不想让别的文件访问和调用,那么我们在声明函数的时候前面加上static就可以了。

使用内部函数的好处有二:

1、可以让某些内部函数不为人所能使用,而仅仅让调用者使用他能使用的东西,有利于保护代码。

2、不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 13

    粉丝
  • 1

    好友
  • 35

    获赞
  • 156

    评论
  • 4698

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 22:20 , Processed in 0.014565 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部