前言-变量的储存方法

在C语言中,供用户使用的储存空间分为3个部分,程序区、静态储存区和动态储存区。其中,程序区存放的是可执行程序的机器指令,静态储存区存放的是在程序运行期间需要占用固定储存单元的变量,如全局变量;动态存储区存放的是程序运行期间需要动态分配储存空间的变量,如函数的形参变量、局部变量等。
变量的存储属性就是数据在内存中的存储方法,可分为两大类:动态存储和静态存储。

1、static与extern在变量存储上的区别

1.1.1static既可用于存储局部变量,也可用于存储全局变量

1.1.1static用于存储局部静态变量

如果希望函数调用结束后仍然保留其中定义的局部变量的值,则可将局部变量定义为局部静态变量。一般形式为

static 类型说明符 变量名;

特点如下:
(1)局部静态变量是在静态存储区分配储存单元,在整个程序运行期间都不释放。因此,在函数调用结束后,它的值并不消失,其值能够保证连续性。
(2)局部静态变量是在编译过程中赋初值的,且只赋一次初值,在程序运行期间其初值已定,以后每次调用函数时不再赋初值,而是保留上一次函数调用结束后的结果;
(3)局部静态变量的默认初值为0(对数值型变量),或空字符(对字符型变量)。

1.1.2static用于存储静态全局变量

在程序设计时,如果希望在一个文件中定义的全局变量仅限于被本文件引用,而不能被其他文件访问,则可以在定义此全局变量是,在前面加上关键字static。例如:

static int x;

注意,此时全局变量的作用于仅限于本文件,在其他文件中即使使用了extern说明,也无法使用该变量。(可看文全文后回头再看这句话)

1.2extern用于存储外部全局变量

对于一个很大的程序,为了编写、调试、编译和修改程序的方便,常把一个程序设计成多个文件的模块结构。每个模块或文件完成一个或几个较小的功能。这样,就可以先对每个模块或每个文件进行单独编译,然后再讲各模块连接在一起。因此,在多个源程序文件的情况下,如果在一个文件中要引用其他文件中定义的全局变量,则需要在引用此变量的文件中,用extern进行说明
例如在prog1.c中存在一个全局变量a,如果想在prog2.c中使用全局变量a,则需要在prog2.c中提前说明:

extern int a;

这行语句说明该变量a已经在其他文件中被定义过,本文件不必在为其分配内存。
注意:
(1)extern只能用来说明变量,不能用来定义变量,因为其不产生新的变量,只是宣布该变量已经在其他地方有过定义。因此,供其他文件访问的全局变量,在程序中只能定义一次,但是在不同的地方可以多次被说明为外部变量。
(2)extern不能用于初始化变量,例如

extern int x=1;

为错误用法。
(3)静态全部变量与外部全局变量在同一文件内的作用域是一样的,但是外部全局变量的作用域可延伸至其他程序文件,而静态全局变量在被定义的源程序文件以外是不可见的。

2、extern与static在函数定义上的区别-内部函数与外部函数

2.1 static与内部函数

内部函数也称为静态函数,它只能被本文件中的其他函数所调用。此处的“静态”不是指存储方式,而是指对函数的作用域仅限于本文件。内部函数定义的一般形式:

static 类型说明符 函数名 (形式参数生命)

例如:

static float sum(float x, float y)
{
}

使用内部函数的意义

使用内部函数,可以使函数的使用范围仅限于本文件,如果在不同的文件中有同名的内部函数,也不会互相干扰。这样有利于不同的人分工编写不同的函数,而不必担心函数是否同名。

2.2 extern 与外部函数

在定义函数时,如果使用了关键字extern ,表明此函数是外部函数。例如:

extern char compare( char s1, char s2)
{
}

由于函数都是外部性质的,因此在定义函数时,关键字extern可以省略。
但是,在调用函数的文件中,一般要用extern说明所调用的函数是外部函数。例如,若在源文件A中调用另一源文件B中的函数compare,则需要在源文件A中对函数compare进行说明,格式如下:

extern char compare();

参考资料

本文主要参考《C语言程序设计教程》第3版, 朱鸣华等编著。

C语言中static与extern用法总结相关推荐

  1. c语言中static函数的用法

    static 使用 static 修饰的变量/函数称为静态成员变量/函数 static在c语言中用法主要为: 1. 修饰局部变量 2. 修饰函数和全局变量 1. static修饰局部变量 static ...

  2. c语言sinx的作用,C语言中 sinx cosx 的用法

    #include #include int main() { double pi=acos(-1.0); double angle; scanf("%lf",&angle) ...

  3. c语言中rand()的作用,c语言中的rand()函数用法

    rand() rand()函数作用:用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()函数返回:返回一个范围在 ...

  4. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  5. C语言中static详细分析

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

  6. C语言中static变量详解

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

  7. C语言中static关键字的作用

    在C语言中static的作用如下 第一.在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放.  第二.static修饰全局变量的时候, ...

  8. 【✊基础不牢,地动山摇のC语言中static关键字✊】

    C语言中static关键字 用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分.要降对象指定为静态存储,可以在正常的声明之前加上关键字static作为前缀. ...

  9. c语言中static变量

    c语言中static变量 2009-06-30 20:33:24|  分类:默认分类 |  标签:|字号大中小 订阅 static静态变量声明符. 在声明它的程序块,子程序块或函数内部有效,值保持,在 ...

最新文章

  1. GitHub超4.1万星,最全Python入门算法来了
  2. java中map可以为空吗_检查NavigableMap是否在Java中为空
  3. QT Creator应用程序开发——01简单按钮显示
  4. 智能电网时代的网络空间安全
  5. 世纪互联云和华为共同打造的数据中心是一个很好的一步标志!
  6. osg指定向量旋转指定角度
  7. plot函数_时间序列:python移动窗口函数前言
  8. 2018春节前新马泰游
  9. 用户 sa 登录失败。_Sqlserver2008R2特定用户只能查看管理指定的数据库
  10. JDBC(尚硅谷宋红康老师笔记)
  11. 前端高级——Node的变迁
  12. C++字符串常量总结(包含表达式必须是可修改的左值问题)
  13. python 流水作业调度_动态规划——流水作业调度问题
  14. 魔力 java下载安装,UBNT EdgeMAX EdgeRouter ERPoE-5 POE+ UAP-AC-PRO开箱及安装调试
  15. badfail@qq.com+java_Java KeeperException.BadArgumentsException方法代码示例
  16. Linux C报错: /usr/bin/ld: cannot find -ldb
  17. 金海佳学C++primer 练习9.20
  18. 【FPGA工程篇】图像采集及显示(一)
  19. 网站服务器域名费用入什么科目,域名费用计入什么科目
  20. 计算机房按几类防雷,计算机机房防雷方案

热门文章

  1. R语言自学笔记:数据处理、数据分布及数据检验
  2. 编写程序判断输入的字母是元音(Vowel)还是辅音(Consonant)。
  3. Drools记录之DRL规则语言
  4. c语言strstr的使用及模拟实现strstr函数
  5. 火车头采集细节(二)
  6. Java Web之JSP技术
  7. @Scheduled使用及讲解
  8. zeroMQ支持PGM协议编译
  9. 布局篇-WrapPanel布局
  10. 2021NCTF-RE