C语言:static作用(修饰函数、局部变量、全局变量)

一、 static全局变量与普通的全局变量有什么区别 ?
 
 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
    全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
    这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 
    static全局变量只初使化一次,防止在其他文件单元中被引用;   
二、static局部变量和普通局部变量有什么区别 ?
   把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。  
       static局部变量只被初始化一次,下一次依据上一次结果值;   
三、static函数与普通函数有什么区别?

   static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
  static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
四、static的三条重要作用,首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
       1、隐藏
          1.1当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是static_extern.c,另一个是static_main.c。
1.2 static_main.c
#include<stdio.h>void main(void)
{extern char i;    // extern variable must be declared before useprintf("%c ", i);msg();return 0;
}

1.3 static_extern.c

char i = 'A'; // global variable
void msg()
{printf("I Love Beijing!I Love hanyue!\n");
}

1.4编译&执行

       1.5你可能会问:为什么在 static_extern.c中定义的全局变量i和函数msg能在 static_main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,i是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件 static_main.c是可见的。如果加了static,就会对其它源文件隐藏。例如在i和msg的定义前加上static, static_main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。

  
     2、static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
       2.1 static_main.c
#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;
}

2.2编译&执行


3、static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。不妨做个小实验验证一下。
   3.1 static_main.c
#include <stdio.h>int a;int main(void)
{int i;static char str[10];printf("integer: %d;  string: (begin)%s(end)\n", a, str);return 0;
}

2.2编译&执行

C语言:static作用(修饰函数、局部变量、全局变量)相关推荐

  1. 对C语言 static作用——修饰 变量(全局变量/局部变量)、函数

    *******************************概念******************************************** ********************** ...

  2. C语言static关键字修饰变量及函数时的用法和原理

    目录 一.static关键字修饰局部变量 二.static关键字修饰全局变量 三.static关键字修饰函数 一.static关键字修饰局部变量 在内存中,往往将其分为三个区块,栈区,堆区,静态区.C ...

  3. 对C++ static作用——修饰 数据成员(改变为静态数据成员)、 成员函数(改变为静态成员函数)

    **************************C++中的static的用法******************************** *************************** ...

  4. c++语言static作用,详解c++中的 static 关键字及作用

    注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...

  5. C语言 static变量和函数详解

    概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护. 但是对于c语言初学者,static由于使用灵活,并不容易掌握.本文就static在c语言中的应用进 ...

  6. python函数对变量的作用_python函数局部变量用法

    当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的.这称为变量的 作用域 .所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开 ...

  7. c语言 static变量和函数

    static int a = 2; //1.static只能在本文件使用此变量 //2.每个文件可以定义一个static全局变量 //3.static没有声明,只有定义,只有定义往后的代码才能使用 # ...

  8. C语言F2的作用,c语言static的作用

    1.全局变量前的static作用:限制该全局变量的作用域到本文件结束. 例如:下面3个文件,f1.cpp中的全局变量只能在f1.cpp中使用:f2.cpp使用的是f3.cpp中定义的全局变量a. // ...

  9. c语言static的作用

    1.全局变量前的static作用:限制该全局变量的作用域到本文件结束. 例如:一个项目有下面3个文件,f1.cpp中的全局变量a只能在f1.cpp中使用:f2.cpp使用的是f3.cpp中定义的全局变 ...

  10. python 函数递归一次增加一次变量_python函数局部变量、全局变量、递归知识点总结...

    函数局部变量 全局变量 及其作用域 #简单类型(int str等)变量的局部变量与全局变量及其作用域的关系 name = "xxx" #第一级顶头定义的变量都称为全局变量,其作用域 ...

最新文章

  1. FormData上传文件同时附带其他参数
  2. EventBus初解
  3. ssl1747-登山机器人【离散化,玄学,贪心】
  4. 数据分析工具篇pyspark应用详解——Pyspark实现PCA主成分
  5. MyBatis 特殊字符处理
  6. Android 中的Activity的静态变量问题
  7. 3D版pix2pix来了,画一只猫就能抱起来吸丨github
  8. vsn服务器 需要先建项目才能,急求!项目马上上线,但是Oracle服务器存在问题...
  9. Git小结---So far.......
  10. FISCO BCOS Solidity 智能合约 批量插入新增数据
  11. 像向日葵一样活着——想起了从幼稚园到现在的同桌们
  12. 征途对计算机配置要求,征途2配置要求是什么?
  13. 编译安装cacti-spine
  14. 电脑公司GHOST WIN7 装机旗舰版 2013 09
  15. python123m与n的数学运算_【Python数学面试题】面试问题:Python“… - 看准网
  16. C++ Combo Box控件用法
  17. 【XSY2538】/【HDU6155】Subsequence Count(矩阵乘法+线段树)
  18. ES--IK分词器安装
  19. Neon intrinsics
  20. 图说大型网站的技术架构

热门文章

  1. MayaDay4模型模块:加线命令
  2. Java包装类以及作用
  3. birch聚类 java_10 聚类算法 - 代码案例四 - 层次聚类(BIRCH)算法参数比较
  4. mysql 5.分组数据
  5. 【收藏】这么多WEB组件(CSS),攒一个网站够了吧?
  6. 高颜值的蓝牙耳机值得入手吗?五款外观性能兼具的蓝牙耳机推荐
  7. linux如何ubuntu解压tar.gz格式的文件
  8. python爬虫实践报告_Python网络爬虫从入门到实践
  9. 【转载】 塔防设计创新点
  10. 基于WG2005的PCB设计-DxDesigner使用指南(一)