当前位置:  编程技术>c/c++/嵌入式

c语言中static的用法详细示例分析

    来源: 互联网  发布时间:2014-10-18

    本文导语:  static在c里面可以用来修饰变量,也可以用来修饰函数。先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不是堆,不要弄混。 代码如下:int a ;int main(){    int b ;     in...

static在c里面可以用来修饰变量,也可以用来修饰函数。
先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不是堆,不要弄混。

代码如下:

int a ;
int main()
{
    int b ;
    int c* = (int *)malloc(sizeof(int));
}

a是全局变量,b是栈变量,c是堆变量。
static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的程序是由好多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。

static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。但加入static修饰之后,变量已经不再存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。

static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。

文件a.c

代码如下:

static int i; //只在a文件中用
int j;          //在工程里用
static void init()         //只在a文件中用
{
}
void callme()          //在工程中用
{
    static int sum;
}

上面的全局i变量和init()函数只能用在a.c文件中,全局变量sum的作用域只在callme里。变量j和函数callme()的全局限扩充到整个工程文件。所以可以在下面的b.c中用extern关键字调用。extern告诉编译器这个变量或者函数在其他文件里已经被定义了。

文件b.c

代码如下:

extern int j;                    //调用a文件里的
extern void callme();   //调用a文件里的
int main()
{
  ...
}

extern的另外用法是当C和C++混合编程时如果c++调用的是c源文件定义的函数或者变量,那么要加extern来告诉编译器用c方式命名函数:

文件A.cpp调用a.c里面的变量i和函数callme()

代码如下:

extern "C"  //在c++文件里调用c文件中的变量
{
   int j;
   void callme();
}
int main()
{
   callme();
}

二 static法则:
A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;

全局变量有外部、静态两种存储方式。
(1)全局变量一般用外部存储方式存储,用保留字extern加以定义。此时,变量的作用域是构成整个程序的所有程序文件,也就是定义的外部变量可供其它程序文件使用。
使用这样的全局变量一定要非常慎重,一旦产生错误,将波及整个程序。

(2)如果希望全局变量仅限于本程序文件使用,而其它程序文件中不能引用,这时必须将其存储方式定义为静态存储方式,用保留字static加以定义。此时称为静态外部变量。
例如,在上例文件filel.c中,如果作这样的定义:
static int a:
则变量a的作用域被缩小至本程序文件filel.c,文件file2.c中不能引用。
值得注意的是对全局变量加static,定义为静态存储方式,并不意味着是静态存储;而不加static,是动态存储。两种形式的全局变量(外部变量)都是静态存储方式,都是编译时分配存储空间,但作用域不同。使用静态外部变量,有利于隔离错误,有利于模块化程序设计。

(3)全局变量的缺省存储方式是外部存储方式。
前面章节中的程序没有见到变量的存储类别定义,实际上采用变量的缺省存储方式。对局部变量采用auto方式,对全局变量采用extern方式。这也是至今为止,我们在程序中没有见到auto、extern等的原因。
至此,我们对变量的存储类别及数据类型进行了全面讨论,在此作个小结。

1.变量定义的一般形式
存储类别数据类型变量表;

2.变量定义的作用
①规定了变量的取值范围。
②规定了变量进行的运行操作。
③规定了变量的作用域。
④规定了变量的存储方式。
⑤规定了变量占用的存储空间。

3.局部变量和全局变量
从作用域角度将变量分为局部变量和全局变量。它们采取的存储类别如下:

局部变量:
①自动变量,即动态局部变量(离开函数,值就消失)。
②静态局部变量(离开函数,值仍保留)。
③寄存器变量(离开函数,值就消失)。
④形式参数可以定义为自动变量或寄存器变量。

全局变量:
①静态外部变量(只限本程序文件使用)。
②外部变量(即非静态的外部变量,允许其它程序文件引用)。

4.动态存储和静态存储
从变量存在时间可将变量存储分为动态存储和静态存储。静态存储是在整个程序运行时都存在,而动态存储则是在调用函数时临时分配存储单元。

动态存储:
①自动变量(函数内有效)。
②寄存器变量(函数内有效)。
③形式参数。

静态存储:
①静态局部变量(函数内有效)。
②静态外部变量(本程序文件内有效)。
③外部变量(整个程序可引用)。

5.静态存储区和动态存储区
从变量值存放的位置可将变量存储区分为静态存储区和动态存储区:
内存中静态存储区:
①静态局部变量。
②静态外部变量。
③外部变量(可被同一程序其它文件引用)。
内存中动态存储区:自动变量和形式参数。
CPU中的寄存器:寄存器变量。


    
 
 

您可能感兴趣的文章:

  • c语言实现MD5算法完整代码示例
  • 使用c语言判断100以内素数的示例(c语言求素数)
  • c语言中if 语句的作用范围示例代码
  • c语言打印输出双引号的方法示例
  • c语言动态数组示例
  • c语言strftime时间格式化示例
  • c语言文件读写示例(c语言文件操作)
  • c语言求阶乘精确值示例
  • c语言的cps实现求fibonacci数列示例
  • c语言多线程编程使用示例
  • c语言生成随机uuid编码示例
  • 编程技术其它 iis7站长之家
  • c语言随机数函数示例
  • c语言获取文件大小的示例
  • 一个小示例告诉你Python语言的优雅之处
  • C语言小程序 杨辉三角示例代码
  • C语言使用普通循环方法和递归求斐波那契序列示例代码
  • c语言可变参数实现示例
  • 用C语言获取文件的大小示例分享
  • c语言线程终止练习示例
  • c语言合并两个已排序数组的示例(c语言数组排序)
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • 关于C语言中的一些用法,高手进
  • HTML 脚本语言介绍及<script>标签用法
  • C语言变量类型与输出控制用法实例教程
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • C语言中char*和char[]用法区别分析
  • c语言中static和extern的用法详细解析
  • C语言中qsort函数用法实例小结
  • C语言入门之指针用法教程
  • 浅析C语言中assert的用法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Lex/YACC 高手请进,求分析C语言语法例子
  • C语言分析系统日志
  • 如何使用yacc分析c语言程序?
  • 文本语言分析工具 Verbiste
  • c/c++语言位域注意事项分析
  • C语言中自动隐式转换与类型强制转换实例分析
  • C语言new操作的安全性分析
  • 解析c语言中"函数调用中缺少哨兵"的情况分析
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • C语言的递归思想实例分析
  • C语言二叉树的非递归遍历实例分析
  • 为什么要学习C语言 C语言优势分析
  • 对C语言中sizeof细节的三点分析介绍
  • 利用C语言实践OOP,以及new,delete的深入分析
  • C语言宏定义使用分析
  • 关于C语言函数strstr()的分析以及实现
  • c病毒程序原理分析(防范病毒 c语言小病毒示例)
  • 基于C语言指令的深入分析
  • 深入分析C语言中结构体指针的定义与引用详解
  • C语言指针的长度和类型深入分析
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • C语言中间语言 CIL
  • PHP编程语言介绍及安装测试方法
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • 以NetBeans IDE为例介绍如何使用XML中Schema语言


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3