2020-09-05

关于static声明的讨论

  • C语言中的对象和其他语言不同,它指的是一块具体的内存。而我们所写的C程序本质上就是对内存进行操作。比如我们写int a = 5;就在计算机里的内存里指定了一块int类型的变量。并且我们是通过标识符a对这个变量进行访问。对这块内存的操作就是将数字5放入a对象中(也就是a所指向的内存)。

  • 对象具有3个基本属性,即作用域、存储期、链接。

  • 作用域很好理解,可以看作用区域,他实际上是对象(也就是内存)的标识符所作用于整个函数的作用区域。作用域有块作用域,函数作用域,函数原型作用域,文件作用域。块作用域就是花括号以内作用。函数作用域一般用于goto语句,goto语句不常用,所以函数作用域可以忽略。函数原型作用域就是声明函数的时候发生的,此作用域实际上就是在声明函数的小括号区域内。文件作用域就是定义在函数外部的变量。

  • 链接(包括无链接、静态链接、动态链接)可以看做是对作用域的属性的描述。我们已经知道作用域有4种,那么函数作用域、函数原型作用域和块作用域都具有无链接属性。而文件作用域有两种链接属性,包括静态链接和动态链接两种,这两种链接属性的不用就是在于定义的方式不同。

  • 存储期(包括静态存储期、线程存储期、自动存储期、动态分配存储期)就是对象的生存周期。存储期也可以看做是对作用域属性的描述。我们已经知道作用域有4种,那么文件作用域变量都具有静态存储期(也就是说他在程序的执行期间一直存在)。也可以在块作用域中借用static声明制造具有一个静态存储期的对象。

  • 我们通常会本能的将静态存储期和static声明联系起来,其实这两者之间没有任何联系,关键还是看代码所在的程序的具体的位置,进行判断。下面通过具体的程序介绍static的用法。

  • 第一种用法:static用于声明静态无链接的存储类别中(通过两个程序及其运行结果来说明)。
    在这里插入图片描述

  • 运行结果:
    在这里插入图片描述
    在这里插入图片描述

  • 运行结果:
    在这里插入图片描述

  • 上述两个程序的n标识符都是在块作用域中运行,但他们都是无链接的(如果不清楚就看上述无链接的定义)。但是经过static修饰的表达式语句的n对象具有静态存储期。他在程序执行期间会一直存在,且只初始化一次。在函数运行中只能改变它的值,但是不能让他从内存中消失。
    第二种用法:static用于声明静态内部链接的存储类别中。
    在这里插入图片描述
    在这里插入图片描述

  • 上述两个程序的a标识符都是在文件作用域中运行,他们都具有静态存储期(如果不清楚就看上述静态存储期的定义)。但是通过static修饰的表达式语句的a对象具有内部链接的属性,也就是说a对象只能在该函数所在的文件中使用。而没有用static修饰的表达式语句的a对象具有外部链接属性,也就是说a对象在其他文件中也使用。

  • **总结:**所有的对象的具体属性不能仅仅看它的代码所在的语句的基本语法结构,还要看他处于代码段中的哪一个位置。比如上述static的两种用法就说明了在不同的代码段中使用相同的语句造成的所制造对象的属性的不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值