关于 static 的用途
2015-10-16 17:41
246 查看
1、三个作用 第一个作用是 隐藏
输出: Hello
所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件是可见的。
如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
2、static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
#include <stdio.h>
int fun(void){
static int count = 10; // 此语句只在函数第一次调用时执行,后续函数调用此变量的初始值为上次调用后的值,每次调用后存储空间不释放,也就达到了 保持变量内容持久的目的。
return count--;
}
int count = 1; // 这是全局变量
int main(void)
{
printf("global \t \t local static\n");
for(; count <= 10; ++count)
printf("%d \t\t %d\n", count, fun() );
return 0;
}
3、static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00
,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。
再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。不妨做个小实验验证一下
输出:
这里 另外一个源文件里面的 a='A'被隐藏了,所以 这里 a=2 ;就是这个好处,
至于字符串str自然 没有输出,应为都是 0啊。
一句话 总结 static : 最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
输出: Hello
所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件是可见的。
如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
2、static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
#include <stdio.h>
int fun(void){
static int count = 10; // 此语句只在函数第一次调用时执行,后续函数调用此变量的初始值为上次调用后的值,每次调用后存储空间不释放,也就达到了 保持变量内容持久的目的。
return count--;
}
int count = 1; // 这是全局变量
int main(void)
{
printf("global \t \t local static\n");
for(; count <= 10; ++count)
printf("%d \t\t %d\n", count, fun() );
return 0;
}
3、static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00
,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。
再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。不妨做个小实验验证一下
输出:
这里 另外一个源文件里面的 a='A'被隐藏了,所以 这里 a=2 ;就是这个好处,
至于字符串str自然 没有输出,应为都是 0啊。
一句话 总结 static : 最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
相关文章推荐
- 并查集
- Python之BeautifulSoup模块的简单使用
- Linux信号实践(2) --信号分类
- ios 最全的GET | POST请求
- 一种更清晰的Android架构
- shell bash使用,包括判断文件或文件夹是否存在举例
- 菜菜鸟Zend Framework 2 不完全学习涂鸦(四)-- 模块
- 关于Swift使用UITabelView动态加载Cell(NSClassFromString使用问题)
- JPA EntityManager的四个主要方法 ——persist,merge,refresh和remove
- 【前端学习】javascript对象Object
- windows顽固文件删除
- SelectableRoundedImageView——Android图片圆角类库
- Python 2.7 有用的一些链接
- java《类与对象》课后作业
- [Linux] ps命令详解
- Linux信号实践(1) --Linux信号编程概述
- MFCButton Memory leak(内存泄露问题)
- Dell服务器MegaCli命令只返回Exit Code: 0x00问题分析
- Hashmap相关
- 杭电1398