在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修饰函数作用:

禁止在其他文件中引用该函数,另外在其他函数中声明的同名函数不会与该文件中的static函数相互冲突。

c语言中的static变量和static函数相关推荐

  1. c语言中在main外面定义的int变量,C语言中,把变量定义在主函数之外和定义在主函数之内有什么区别...

    C语言中,把变量定义在主函数之外和定义在主函数之内有什么区别 答案:7  信息版本:手机版 解决时间 2018-12-14 06:44 已解决 2018-12-13 14:23 C语言中,把变量定义在 ...

  2. c语言中,关于指针变量前的*有两种表现形式:

     c语言中,关于指针变量前的*有两种表现形式: 变量定义时 如:char *pc;   int *pi; 这里的*是跟随变量类型(char, int...)的,表示指针变量类型,是个标识符 变量引 ...

  3. python static变量_python static变量

    python在函数中有static变量吗 python函数怎么实现static变量? python函数实现static变量具体如下:def ask_ok(prompt, retries=4, comp ...

  4. C语言中auto,register,static,const,volatile的区别

    1)auto 这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是aut ...

  5. static变量、static函数与普通变量、普通函数的区别

    转自:http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/ 全局变量(外部变量)的说明之前再冠以stati ...

  6. php多线程 static变量,private static和public static的比较:多线程间

    private static和public static的比较,区别在于修改的范围不同,但作用域都是全局的即整个进程内共享,与具体线程无关. 以下是测试代码: 声明静态内部变量的抽象类 package ...

  7. static变量和static函数的用法摘抄

    一. static 变量 static变量大致分为三种用法 1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期. 2. 用于全局变量,主要作用是限制此全局变量被其他 ...

  8. c语言中cnthe普通变量,不得不说,关于 *(unsigned long *) 和 (unsigned long)

    @辛昕: 然而我很悲伤地再次郑重声明:我木有错!具体请看我回复 水果君 那难得一见的长回帖的回帖!!这事情居然还可以从遥远的 2月2号 刚下班放假那天开始.那天,水群里,水果君弄了个帖子,说让我去回, ...

  9. C语言中Const指针变量(常指针)

    C语言中,指针是最难理解的一部分,尤其是Const指针变量. Const指针变量只保护其Value值不被改变,并不能保护指针所指向的地址中的值不被改变,下面是针对Const指针的一个小练习: #inc ...

最新文章

  1. 基于Dialog的MFC程序在启动时隐藏为托盘程序(四)
  2. 企业该如何实现数字化转型?
  3. TTDebug 快速打印 log ------rect point size
  4. 第四冠!腾讯AI「绝艺」斩获世界智能围棋公开赛冠军
  5. leetCode 28. Implement strStr() 字符串
  6. DIV CSS布局-固定页面开度布局
  7. 并行计算机架构_计算机科学组织| 并行处理
  8. Java基础 线程同步
  9. 禁用 ssh agent_如何修复“禁用Agent XP”错误
  10. 对美食评语进行情感分析
  11. 认知的四个层次,读懂改变一生
  12. 北京科技大学计算机专业在哪个校区,北京科技大学有几个校区及校区地址
  13. openGauss数据库开发调试工具指导
  14. 学习英语02——词汇——01
  15. 小飞鱼通达二开 小飞鱼OA开发案例集锦目录(持续更新)
  16. flutter Failed to download https://flutter-io.cn/flutter_infra_release/
  17. 液体混合装置plc控制系统 西门子1200仿真系统 包含程序和画面
  18. 【安全知识分享】安全生产责任制培训.pptx(附下载)
  19. 学生-课程数据库与数据定义
  20. 微波晶体管功率放大器简介

热门文章

  1. MYSQL的地理信息数据库_国内为什么没有开源地理信息数据库?
  2. Shell中的循环语句
  3. 文本编辑器实现文本打印的功能
  4. 微型计算机原理实验报告总结,微机原理实验报告-两个多位十进制数相加的实验等.doc...
  5. c分布 的程序设计语言,#2020学习打卡##C程序设计语言# C语言中的随机数函数解析...
  6. tensorflow-TFRecord 用法
  7. C++ 有符号整数和无符号整数修饰符之间的差别
  8. 计算机课程大作业答案,计算机接口技术课堂大作业(1)参考答案
  9. 图像条纹检测 python_【连载4.5】特征检测技术研究面向强反射表面的多传感器三维检测技术研究...
  10. 文巾解题 178. 分数排名