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.2static_main.c

#include<stdio.h>
     
    void main(void)
    {
        extern char i;    // extern variable must be declared before use
        printf("%c ", i);
        msg();
        return 0;
    }

1.3static_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编译&执行

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

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

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

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

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

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

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

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

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

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

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

  6. Python基础day04【函数(定义与调用、文档说明、传参函数、全局变量、返回值、嵌套调用)】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day04[字典]    目录 3.函数 函数的定义和调用 函数定义 PEP8规范 ...

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

    C语言:static作用(修饰函数.局部变量.全局变量) 一. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.  全局变 ...

  8. static关键字(修饰函数、局部变量、全局变量)

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有 ...

  9. java中static修饰函数_详解java中static关键词的作用

    在java中,static是一个修饰符,用于修饰类的成员方法.类的成员变量,另外可以编写static代码块来优化程序性能:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载 ...

最新文章

  1. Eclipse 调试器(引用IT168)
  2. qtcreator安装后的设置
  3. 一代数学大家--John Conway逝世,丘成桐、陶哲轩纷纷发文缅怀!
  4. Android开发之Handler的使用方法(源代码分享)
  5. php收集radio表单,jQuery对于单选表单(radio)以及其它表单取值
  6. 如何重新安装TCP/IP协议
  7. dblink传输clob字段
  8. 一个好端端的团队是如何被管理者搞垮的?
  9. 操作选项_Win 10系统中的电源选项及任务栏图标等功能介绍和操作
  10. Warning: Data truncated for column #39;AirPress#39; at row 1
  11. call_user_func_array
  12. html含有一级子元素,html – 根据父级内的计数设置子元素
  13. 基于Matlab的表面肌电信号处理软件设计与开发
  14. html代码中数学公式,html中使用mathjax数学公式
  15. 数组和集合的互相转换
  16. 直流稳压稳流电源基本功能,电源使用注意事项
  17. 正交性的好处和实现方法
  18. 怎么用PDF裁剪工具来裁剪PDF页面
  19. 流年似水 启航2019
  20. ws office ppt基础知识

热门文章

  1. 小程序 使用cookie保存登录态
  2. 语音识别的痛点在哪,从交互到精准识别如何做?
  3. 入狱小技巧之木马制作——图片木马制作
  4. 基于位置数据的分析挖掘
  5. 【Jquery】-------JS实现关键字检索html内容,符合关键字的匹配项,进行标注背景色,可进行上一个,下一个切换定位
  6. 单片机与嵌入式的区别
  7. UGG正式宣布宋妍霏成为其品牌大使
  8. C++实现二分法求零点(二分法求零点)
  9. 科学课中如何利用计算机教学,浅谈小学科学课上计算机技术的运用
  10. 个人计算机与手机的区别,手机与电脑的显示区别:一张“照片”来告诉你原因...