变量的属性——C语言中的变量属性

时间:2023-02-06 14:50:15

变量的属性类比

(1)意思解释:
事物本身所固有的性质,是物质必然的、基本的、不可分离的特性,又是事物某个方面质的表现。
(2)理解:
属性可以理解为一个人的性格,我们说这个人很和蔼,那么和蔼就是这个人的“属性”。
(3)推论:
我们也可以给变量定义一个“属性”,然后把变量进行分类放在不同的地方吗?

答案是可以的。
1. C语言中的变量可以有自己的属性
2. 在定义变量的时候可以加上“属性”关键字
3. “属性”关键字指明变量的特有意义。

语法:property type var_name;

C语言变量的属性

C语言变量的属性大致可以分为四种特性:存储类型、作用域、链接属性和生命周期。

存储类

存储类就是存储类型,也就是描述C语言变量存储在内存的那个区域的属性。
1. 内存有多种管理方法——数据段、bss段、.text段、堆、栈…,一个变量的存储类属性就是描述这个变量存储在哪一个内存段中。

譬如:局部变量分配在栈上,所以它的存储类就是栈;显式初始化为非0的全局变量分配在数据段,显式初始化为0和没有显示初始化(默认为0)的全局变量分配在bss段。
2. 可以影响变量存储类属性的关键字有:auto、static、const、register

作用域

作用域是描述这个变量起作用的代码范围。
编译器可以确认4种不同类型的作用域——文件作用域、代码块作用域、函数作用域、原型作用域。
1. 代码块作用域:

位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的变量都具有代码块作用域。

2. 文件作用域:

任何在代码块之外声明的标识符都具有文件作用域,它表示这些变量从他们的声明之处知道它所在源文件结尾处都是可以访问的。

3. 原型作用域:

原型作用域只适用于在函数原型中声明的参数名

4. 函数作用域:

实际上函数作用域包含代码块作用域,且自己本身也属于一个代码块作用域。函数作用域中不同的代码块作用域可以使用同一个名字。但不建议这样做。所以函数作用域可以简化为一条规则——一个函数中的所有语句标签必须唯一。
注意:当变量同名时,小范围的作用域覆盖大范围的作用域。

链接属性

我们知道程序从源代码到可执行程序,经历的过程是:编译、链接。
链接:链接就是当组成一个程序的各个源程序分别被编译之后,所有的目标文件以及那些从一个或多个函数库中中引用的函数链接在一起,形成可执行程序。

链接属性一共有3种——external(外部)、internal(内部)和none(无)。

1. none(无链接属性)

没有链接属性的标识符总是被当作单独的个体,也就是说该标识符的多个声明都会单独申请一段内存空间。

2. internal(内链接属性)

属于内链接属性的标识符在同一个源文件内的所用声明中都指向同一个实体(内存空间),但位于不同源文件的多个声明则分属不同的实体。

3. external(外链接属性)

属于外链接属性的标识符不论声明多少次、位于几个源文件都表示同一个实体。
注意:可以影响变量链接属性的关键字有:static、extern

生命周期

生命周期是描述这个变量什么时候诞生以及什么时候被销毁。