c语言中的static变量和static函数
在C语言中,static的字面意思很容易把我们导入歧途,其实它的修饰变量作用有三条。
(1)先来介绍它的第一条也是最重要的一条:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。
下面是a.c的内容
void msg()
{
printf("Hello\n");
}
下面是main.c的内容
{
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 还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
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’。不妨做个小实验验证一下。
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函数相关推荐
- c语言中在main外面定义的int变量,C语言中,把变量定义在主函数之外和定义在主函数之内有什么区别...
C语言中,把变量定义在主函数之外和定义在主函数之内有什么区别 答案:7 信息版本:手机版 解决时间 2018-12-14 06:44 已解决 2018-12-13 14:23 C语言中,把变量定义在 ...
- c语言中,关于指针变量前的*有两种表现形式:
c语言中,关于指针变量前的*有两种表现形式: 变量定义时 如:char *pc; int *pi; 这里的*是跟随变量类型(char, int...)的,表示指针变量类型,是个标识符 变量引 ...
- python static变量_python static变量
python在函数中有static变量吗 python函数怎么实现static变量? python函数实现static变量具体如下:def ask_ok(prompt, retries=4, comp ...
- C语言中auto,register,static,const,volatile的区别
1)auto 这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是aut ...
- static变量、static函数与普通变量、普通函数的区别
转自:http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/ 全局变量(外部变量)的说明之前再冠以stati ...
- php多线程 static变量,private static和public static的比较:多线程间
private static和public static的比较,区别在于修改的范围不同,但作用域都是全局的即整个进程内共享,与具体线程无关. 以下是测试代码: 声明静态内部变量的抽象类 package ...
- static变量和static函数的用法摘抄
一. static 变量 static变量大致分为三种用法 1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期. 2. 用于全局变量,主要作用是限制此全局变量被其他 ...
- c语言中cnthe普通变量,不得不说,关于 *(unsigned long *) 和 (unsigned long)
@辛昕: 然而我很悲伤地再次郑重声明:我木有错!具体请看我回复 水果君 那难得一见的长回帖的回帖!!这事情居然还可以从遥远的 2月2号 刚下班放假那天开始.那天,水群里,水果君弄了个帖子,说让我去回, ...
- C语言中Const指针变量(常指针)
C语言中,指针是最难理解的一部分,尤其是Const指针变量. Const指针变量只保护其Value值不被改变,并不能保护指针所指向的地址中的值不被改变,下面是针对Const指针的一个小练习: #inc ...
最新文章
- 基于Dialog的MFC程序在启动时隐藏为托盘程序(四)
- 企业该如何实现数字化转型?
- TTDebug 快速打印 log ------rect point size
- 第四冠!腾讯AI「绝艺」斩获世界智能围棋公开赛冠军
- leetCode 28. Implement strStr() 字符串
- DIV CSS布局-固定页面开度布局
- 并行计算机架构_计算机科学组织| 并行处理
- Java基础 线程同步
- 禁用 ssh agent_如何修复“禁用Agent XP”错误
- 对美食评语进行情感分析
- 认知的四个层次,读懂改变一生
- 北京科技大学计算机专业在哪个校区,北京科技大学有几个校区及校区地址
- openGauss数据库开发调试工具指导
- 学习英语02——词汇——01
- 小飞鱼通达二开 小飞鱼OA开发案例集锦目录(持续更新)
- flutter Failed to download https://flutter-io.cn/flutter_infra_release/
- 液体混合装置plc控制系统 西门子1200仿真系统 包含程序和画面
- 【安全知识分享】安全生产责任制培训.pptx(附下载)
- 学生-课程数据库与数据定义
- 微波晶体管功率放大器简介
热门文章
- MYSQL的地理信息数据库_国内为什么没有开源地理信息数据库?
- Shell中的循环语句
- 文本编辑器实现文本打印的功能
- 微型计算机原理实验报告总结,微机原理实验报告-两个多位十进制数相加的实验等.doc...
- c分布 的程序设计语言,#2020学习打卡##C程序设计语言# C语言中的随机数函数解析...
- tensorflow-TFRecord 用法
- C++ 有符号整数和无符号整数修饰符之间的差别
- 计算机课程大作业答案,计算机接口技术课堂大作业(1)参考答案
- 图像条纹检测 python_【连载4.5】特征检测技术研究面向强反射表面的多传感器三维检测技术研究...
- 文巾解题 178. 分数排名