一起talk C栗子吧(第一百二十六回:C语言实例--static关键字)
来源:互联网 发布:java中public的作用 编辑:程序博客网 时间:2024/04/29 13:10
各位看官们,大家好,上一回中咱们说的内置宏的例子,这一回咱们说的例子是:static关键字。闲话休提,言归正转。让我们一起talk C栗子吧!
看官们,C语言提供了static关键字,它经常出现在变量或者函数的最前面,为什么要加上它呢?它主要有什么作用呢?今天我们一起来了解static关键字。
在介绍之前,我们先做一些铺垫。主要是介绍一下变量或者函数的生命周期和作用域。
变量和函数的生命周期
所谓的生命周期就是指变量或者函数在程序中可以被使用的时间,它是一段时间,可能是一分钟或者一小时等。生命周期通常从开始使用变量的时间算起,直到结束使用变量为止,在这个时间段内的时间就叫作变量的生命周期。这有点类似自然界的春夏秋冬,每年都是从春天开始,直到冬天结束。从春天到冬天的这个过程就是一个周期,只是我们习惯叫这个周期为一年。
C语言中的变量有全局变量和局部变量,全局变量的生命周期和程序的生命周期相同,也就是说全局变量贯穿于整个程序的运行过程。局部变量的生命周期没有这么长,它只在需要使用它的时候才开始出现,使用完成后,它完成了自己的使命,进而结束生命。最常见的是函数中的变量,这些变量都是局部变量,它们随着函数的运行而开始,函数运行结束后,它们也会消失。
接下来我们举一个实际的例子来说明变量的生命周期:
int globle_value = 1;void func(){ int local_value = 3; printf("globle_value = %d \n",globle_value); //在该函数中可以使用全局变量 printf("local_value = %d \n",local_value); //在该函数中可以使用局部变量}int main(){ func(); printf("globle_value = %d \n",globle_value); //在主函数中可以使用全局变量 //printf("local_value = %d \n",local_value); //在主函数中不能使用局部变量 return 0;}
我们把上面的代码保存到一个文件中,并且编译该文件,然后运行编译后的程序,程序的运行结果如下:
globle_value = 1 //在func函数中可以使用全局变量local_value = 3 //在func函数中可以使用全局变量 globle_value = 1 //在main函数中只能使用全局变量
从上面的例子中可以看到,全局变量在自定义的func函数和主函数中都可以被使用,因为它的生命周期和程序的生命周期相同。而局部变量只能在func函数中使用,不能在主函数中使用,如果去掉程序中的注释那么就会产生“变量未定义”的编译错误。原因在于局部变量随着func函数的结束而结束,因此在主函数中看不到局部变量。
变量和函数的作用域
变量的作用域表示变量的有效使用范围,变量在某个范围内可以被使用,出了这个范围外就不能被使用了。比如我们日常生活中的身份证,在国内可以随意使用,但是出国后就不能使用了,只能使用护照。这是因为身份证的作用域是国内,出国后就表示超出了身份证的作用域范围,这时就不能再使用身份证了。我们还使用上面的例子进行说明:
- 全局变量globle_value的作用域是整个文件,因此它可以被同一个文件中的func函数和main函数访问。
- 局部变量local_value的作用域是函数func内部。因此它只能在func函数内使用,在其它地方不能使用,因为已经超出了它的作用域。
有了这些铺垫后,我们介绍static关键字就容易多了,static关键字主要有两个功能:限定变量或者函数的生命周期和作用域。
对于变量来说,static不会影响它的生命周期,只是会把未初始化的变量初始化为0。不过它会缩小变量的作用域,这个对局部变量没有影响,主要是把全局变量的作用域缩小到一个文件中,比如我们在上面例子中的全局变量globle_value,它可以在其它文件中使用,如果把它使用static关键字限定后,它就只能在当前的文件中使用了。
下面是一个实际的例子,请大家参考:
static void func(){ int temp; static int static_local_value ; printf("temp = %d \n",temp); // default value is not known printf("static_local_value = %d \n",static_local_value); // default value is 0}
我们在函数func中定义一个普通变量和static修饰的变量,并且都没有初始化它们。编译时会把static变量初始化为0,而不会初始化普通变量。下面是程序的运行结果,请参考:
temp = 134513922 static_local_value = 0
从上面的程序运行结果中可以看到,static变量的默认值是0,而普通变量的默认值是不确定的。
对于函数来说,static不会影响它的生命周期,但是会缩小它的作用域,这点和static限定变量时的效果相同,因此,我就不多介绍了。
看官们,完整的代码放到了我的资源中,大家可以点击这里下载使用。
在编写代码的时候,我们经常使用static来限定变量和函数,主要是为了把它们的作用域缩小到一个文件内,这样做可以避免和其它文件中同名的变量或者函数发生命名冲突。
打个比方,据说国内叫张伟的人特别多,也就是说重名的人很多。如果我在这里叫张伟,那么可能只有一个看官叫张伟,毕竟在这里听我讲小说的看官们人数不是很多,如果我在网上发个帖子说:张伟中奖了。那么可能会有很多叫张伟的人去领奖,如何区分这么多张伟呢,使用static关键字来限定一下就行,哈哈。
各位看官,关于static关键字的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
- 一起talk C栗子吧(第一百二十六回:C语言实例--static关键字)
- 一起talk C栗子吧(第一百二十回:C语言实例--线程属性)
- 一起talk C栗子吧(第一百二十四回:C语言实例--内置宏)
- 一起talk C栗子吧(第一百二十二回:C语言实例--多线程)
- 一起talk C栗子吧(第一百二十九回:C语言实例--C程序内存布局一)
- 一起talk C栗子吧(第一百二十三回:C语言实例--显示变量和函数的地址)
- 一起talk C栗子吧(第一百二十五回:C语言实例--显示文件名和行号)
- 一起talk C栗子吧(第一百二十七回:C语言实例--查看main函数的参数)
- 一起talk C栗子吧(第一百二十八回:C语言实例--查看当前进程信息)
- 一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)
- 一起talk C栗子吧(第一百一十六回:C语言实例--线程同步之互斥量二)
- 一起talk C栗子吧(第二十六回:C语言实例--冒泡排序)
- 一起talk C栗子吧(第三十六回:C语言实例--螺旋矩阵)
- 一起talk C栗子吧(第四十六回:C语言实例--广度优先遍历)
- 一起talk C栗子吧(第六十六回:C语言实例--DIY字符串比较函数)
- 一起talk C栗子吧(第七十六回:C语言实例--DIY cat命令)
- 一起talk C栗子吧(第一百六十四回:C语言实例--const关键字)
- 一起talk C栗子吧(第一百一十回:C语言实例--线程标识符)
- POJ_S1E03_DFS&BFS(3)
- POJ_S1E04
- Professor John(DP)
- Java中的流与文件:ZIP文档
- storm+kafka整合异常处理
- 一起talk C栗子吧(第一百二十六回:C语言实例--static关键字)
- applicationContext.xml 配置文件的存放位置
- Swift模糊背景
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- 汇编学习2
- 做EEPROM的测试中发现一些奇怪问题。器件读写地址不唯一。
- 面试经典33题
- 草稿
- Apache Shiro+SpringMVC+Hibernate Search+Hibernate+Bootstrap企业信息管理系统基础框架搭建整合实例代码教程