在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

❶先来介绍它的第一条也是最重要的一条:隐藏
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。
下面是a.c的内容

char a = 'A'; // global variable
void msg()
{
printf("Hello\n");
}

下面是main.c的内容

int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}

程序的运行结果是:

A Hello

你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?

前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
   如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。

①利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。

②Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。


❷static的第二个作用是保持变量内容的持久。

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。

共有两种变量存储在静态存储区:全局变量和static变量。

只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

虽然这种用法不常见,但还是举一个例子。

#include <stdio.h>
int fun(void)
{
static int count = 10; //事实上此赋值语句从来没有执行过
return count--;
}
int count = 1;
int main(void)
{
printf("global local static \n");
for(; count <= 10; ++count)
printf("%d %d \n", count, fun());
return 0;
}

程序的运行结果是:

global local static
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1

❸static的第三个作用是默认初始化为0。

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00。

某些时候这一特点可以减少程序员的工作量。

比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。

再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加"\0"太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是"\0"。

不妨做个小实验验证一下。

#include <stdio.h>
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,则输出的字符数组内容乱码。


总结

最后对static的三条作用做一句话总结。

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

 

本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1218034

【C/C++】C/C++中Static的作用详述的更多相关文章

  1. C/C++中static关键字作用总结

    来来来,来看这篇文章: http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html 总结一下: 1.先来介绍它的第一条也是最重 ...

  2. C++中static关键字作用总结

    1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件 ...

  3. Java 中 static 的作用

    static 关键字的作用 在 Java 中 static 关键字有4种使用场景,下面分别进行介绍: 1.static 成员变量 public class Student { // 静态成员变量 pr ...

  4. JAVA中static什么作用?

    是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...

  5. C/C++中static关键字作用总结 && 指针与引用的比较

    static作用: 常规答案: 1. 全局变量的隐藏:2. 函数体内记忆功能:3.类所有实例共享,static函数不接受this指针,只能访问static成员变量. 拓展:1.全局变量的隐藏,因为在其 ...

  6. C++中static的作用

    tatic关键字有俩作用:(1).控制存储分配:(2).控制一个名字的可见性和连接.   随着C++名字空间的引入,我们有了更好的,更灵活的方法来控制一个大项目的名字增长.     在类的内部使用st ...

  7. Java:Java中static关键字作用

    static关键字最基本的用法是: 1.被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来 2.被static修饰的方法属于类方法,可以通过类名.方法名直接引用 ...

  8. JAVA中static的作用

    static表示"全局"."静态"的意思,用来修饰成员变量和成员方法,不过在JAVA中没有全局的意思. 1. 被static修饰的成员变量和成员方法独立于该类的 ...

  9. C/C++中 static 的作用

    在C中,有三个作用: 1.修饰全局变量: 作用是隐藏,也就是这个全局变量仅在本文件中可见. 2.修饰局部变量: 作用是扩展变量的生存期,令这个局部变量成为静态的. 3.修饰函数: 作用是隐藏,将此函数 ...

随机推荐

  1. ios中广告滚动页面(uiscrollview)

    展示功能 第一步 引入 “EScrollerView.h”,EScrollerView.m"文件 用法 NSArray *imgarr=@[@"1.jpg",@" ...

  2. 利用LD_PRELOAD hook代码

    loader在进行动态链接的时候,会将有相同符号名的符号覆盖成LD_PRELOAD指定的so文件中的符号.换句话说,可以用我们自己的so库中的函数替换原来库里有的函数,从而达到hook的目的.这和Wi ...

  3. linux shell 脚本攻略学习16--wc命令详解,tree命令详解

    在文本处理的工作中,统计文件的行数,单词数和字符数非常有用.而对于开发人员本身来说,统计LOC(line of code ,代码行数)是一件重要的工作.linux中有什么命令可以帮助我们做统计呢?没错 ...

  4. Linux shell命令:用 !$ 防止误操作

    shell 的通配符匹配非常强大,不过也非常危险,不少同学都碰到这样的问题,比如 rm a*,结果一个手抖,a 和星号之间多了个空格,结果目录下的文件都灰飞烟灭了…… bash 支持一个特殊的变量 ! ...

  5. strace命令解析

    strace常用于跟踪和分析进程执行时中系统调用和耗时以及占用cpu的比例,常用的格式如下: 1.sudo /usr/bin/strace -Ttt -p pid 2>pid.log 跟进pid ...

  6. uploadify.js参数说明(转)

    一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass ” 按钮样式 buttonCursor ‘ ...

  7. 【MyBatis】MyBatis之分页

    关于MyBatis的搭建可以参见“MyBatis的配置”,MyBatis是对JDBC底层代码的封装,关于Oracle.MySQL.SqlServer的分页可以查看Oracle.SqlServer.My ...

  8. struct2 拦截所有没有登录的用户,强行转到登录界面AuthorizationInterceptor

    package com.sise.action; import java.util.Map; import com.opensymphony.xwork2.Action; import com.ope ...

  9. 【struts2】名为chain的ResultType

    1)基本使用 名称为“chain”的ResultType,在struts-default.xml里的配置如下: <result-type name="chain" class ...

  10. Android开发实现计算器的例子

    例子 代码如下 复制代码 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" a ...