博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
static的功能
阅读量:5285 次
发布时间:2019-06-14

本文共 2518 字,大约阅读时间需要 8 分钟。

 static : 翻译成中文是静态的意思。

 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。  

在C语言中,static的字面意思很容易让我们误入歧途,其实它具有三层作用:

(1)隐藏 :这是最static最重要的功能

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。我们写一个小程序来验证一下这句话的意思。我们同时编译两个源文件,一个是a.c,另一个是main.c。

小程序如下所示:

#include 
#include
char a = 'A'; // 全局变量void test() { printf("Hello\n"); }int main(void){ extern char a; // extern variable must be declared before use extern:在文件其位置已经定义,在这里只是声明重新调用 printf("%c ", a); test(); //调用函数void test(); return 0; //每个函数都有返回值,void类型返回为空,在C语言中一般不会写返回值 }

 a.c :

char a = 'A'; // 全局变量void test() {    printf("Hello\n"); }
main.c :
int main(void){        extern char a;      // extern variable must be declared before use  extern:在文件其位置已经定义,在这里只是声明重新调用    printf("%c ", a);       test();            //调用函数void test();    return 0;          //每个函数都有返回值,void类型返回为空,在C语言中一般不会写返回值}

程序的运行结果是:

A Hello

你可能会问:为什么在a.c中定义的全局变量a能在main.c和函数test中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问调用。在这个例子中,a是全局变量,test是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

如果加了static,就会对其它源文件隐藏。例如在a和test的定义前加上static声明,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有以下两个作用:

(2)
保持变量内容的持久 :这是static的第二个作用。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。这种用法是不常见的。
#include 
int fun(void) { static int count = 10; // 事实上此赋值语句从来没有执行过 return count--;}int count = 1; int main(void) {         printf("global\t\tlocal static\n");     for(; count <= 10; ++count)         printf("%d\t\t%d\n", count, fun());              return 0; }

程序的运行结果是:

global          local static1               102               93               84               75               66               57               48               39               210              1

(3)默认初始化为0 : 这是static的第三个作用。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。不妨做个小实验验证一下。

#include 
int a;int main(void){ int i; static char str[10]; printf("integer: %d; string: (begin)%s(end)", a, str); return 0;}
程序的运行结果如下
integer: 0; string: (begin)(end)

static的三个作用是:

(1)隐藏

(2)保持变量内容的持久

(3)默认初始化为0

用一句话来描述就是:首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。

 

转载于:https://www.cnblogs.com/zhangjiansheng/p/6753776.html

你可能感兴趣的文章
bzoj1230 [Usaco2008 Nov]lites 开关灯
查看>>
Modulation of Lipid Metabolism by Celastrol (文献分享一组-赵倩倩)
查看>>
HDU 1044 Collect More Jewels(BFS+DFS)
查看>>
TrackbarCallback 回调函数必须为 void(int,void*)
查看>>
【BZOJ1857】[Scoi2010]传送带 三分法
查看>>
得到相册里面的全部图片
查看>>
JPA与Spring2.5整合时发生不能创建entityManagerFactory的问题解决方法
查看>>
FastDFS 初始
查看>>
选项卡
查看>>
14-----定时器
查看>>
XidianOJ 1028 数字工程
查看>>
派遣函数
查看>>
教程6--配置ssh
查看>>
C#串口扫描枪的简单实现
查看>>
SharePoint各版本信息
查看>>
Python数据结构——散列表
查看>>
.Net学习笔记----2015-07-08(基础复习和练习03)
查看>>
IDEA 中Spark SQL通过JDBC连接mysql数据库
查看>>
组合数学之母函数问题
查看>>
JavaScript创建对象之单例、工厂、构造函数模式
查看>>