C中static的用法

转载 2012年03月30日 20:51:11

这篇文章讲C中static的用法,感觉很经典,转自http://www.cnblogs.com/dc10101/archive/2007/08/22/865556.html

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

(1)先来介绍它的第一条也是最重要的一条:隐藏。

当我们同时编译多个文件时,所有未加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还有下面两个作用。

(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\tlocal static\n");
    
for(; count <= 10++count)
        printf(
"%d\t\t%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

 

(3)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变量存放在静态存储区,所以它具备持久性和默认值0。


static在C语言中主要是两种用法

static在C语言中主要是两种用法 1、修饰局部变量 2、修饰函数和全局变量 局部变量按照存储形式来分,分为auto,static,register 首先从内存四区的角度去看...
  • y780465649
  • y780465649
  • 2016年08月08日 21:05
  • 3612

简述static关键字在c/c++中的作用

在C语言中,关键字static有三个明显的作用: 1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。 2) 在模块内(但在函数体外),一个被声明为...
  • qq_36631758
  • qq_36631758
  • 2017年07月27日 12:51
  • 1112

C语言中static的使用

在开发过程中,我们经常会需要定义一些static类型的变量或者函数,我们接下来来具体聊一下static; 1、修饰变量      当static来修饰一个变量时,就注定了这个变量的可见范围和生命周...
  • lixiaojie1012
  • lixiaojie1012
  • 2014年04月30日 00:16
  • 1369

在C语言中static关键字的作用

static关键字的作用 在C语言中 static修饰函数的时候 静态函数:作用范围仅限于它的源文件,即只有本文件内才可以调用,函数名在其他文件内不可 见。 static...
  • lf1570180470
  • lf1570180470
  • 2017年02月22日 17:39
  • 522

c/c++ static 用法总结(三版本合一)

最近经历了一些笔试和面试,经常会被问到static关键字的作用,感觉虽然知道一些,但 每次回答的都不够满意,今天在网上查了一下,总结总结,恩,以备后用! 综述 sta...
  • mznewfacer
  • mznewfacer
  • 2011年10月23日 13:32
  • 3632

从内存分配角度分析c和java里的static 关键字.

即使作为Java的初学者, 对this 和 static 这两个关键字都不会陌生. 其实也不难理解:     this 关键字:  指的是对象的本身(注意不是类本身)  跟.net 语言的Me 关键字...
  • nvd11
  • nvd11
  • 2013年12月30日 00:05
  • 1851

C语言中static用法

google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大。所以,我这篇博文博采众家之长,把互...
  • hitman_cs
  • hitman_cs
  • 2017年04月24日 16:21
  • 277

static关键字在C和C++中的使用方法

一、C语言的static关键字的两种使用方法 1)、用于函数内部修饰变量,即函数内的静态变量。这种变量的生存期长于该函数,是的函数具有一定的“状态”,使用静态变量的函数一般是不可重入的,也不是线程安全...
  • yusiguyuan
  • yusiguyuan
  • 2014年11月09日 15:23
  • 994

Java中static作用及用法详解

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

C++ static、const和static const、引用以及它们的初始化

const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。       static表示的是静态的。类的静态成员函数、静态成员变量是和类相...
  • huthnli
  • huthnli
  • 2014年09月07日 23:04
  • 1040
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C中static的用法
举报原因:
原因补充:

(最多只允许输入30个字)