Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1396176
  • 博文数量: 143
  • 博客积分: 10005
  • 博客等级: 上将
  • 技术积分: 1535
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-23 17:25
个人简介

淡泊明志 宁静致远

文章分类

全部博文(143)

文章存档

2011年(2)

2009年(1)

2007年(22)

2006年(118)

我的朋友

分类: C/C++

2007-05-21 12:30:59

【我解C语言面试题系列】001 static有什么用途?


【题目】static有什么用途?

 

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

1、限制变量的作用域

2、设置变量的存储域

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

 

下面是我给出的答案:

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

1、声明静态局部变量。

2、声明静态外部全局变量。

3、声明静态外部函数。

 

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

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

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

1、  存储空间分配、作用域和生存期

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

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

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

2、赋初值时的处理方式

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

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

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

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

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

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

 

静态外部全局变量

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

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

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

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

 

静态外部函数

 

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

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

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

2、不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
阅读(5390) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-02-03 14:32:53

2、声明静态外部全局变量。 3、声明静态外部函数。 这两句话明显是错的,但是我是看完的,总体还是很好的 声明静态内部全局变量 不是外部 声明静态内部函数 不是外部