作用域 属性链接 存储类型

一:作用域:

4中不同类型的作用域:代码块作用域,函数作用域,文件作用域和原型作用域

1:代码块作用域:

一对花括弧的代码称作一个代码块,任何在花括弧开始声明的标识符都具有代码块作用域

形参隐藏的问题:

      K&RC中,形参在函数体外的声明中开始变生效,如果在函数体内有同名的表示服,他们就会将形参隐藏。
      ANSIC中避免了这种情况,他把形参的作用域定义在函数最外层的那个函数体,也就是整个函数体,这样,声明与函数最外的局部变量无法和形参同名,因为他们的作用域相同
2:文件作用域:

任何在所有代码块之外声明的表示符都具有文件作用域

3:原型作用域:

函数原型中声明的参数名

只是为了防止名字冲突,但是并不是很有必要

4:函数作用域

他只是适用于语句标签,语句标签用于goto语句

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割线

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

标识符的链接属性决定如何处理在不同文件中出现的标识符,标识符的作用域和他的连接属性也有关系,但是这两者并不是完全一样

链接属性一共有三种,external(外部的),internal(内部的)和none(无)

none的链接属性被当做单独的个体,也就是该标识符的多个声明被称为独立的个体

internal属性的标识符在同一个文件中的被认为是一个实体,不同的文件中被认为是不同的实体,

external属性的标识符在不同的文件,无论被声明多少次都被认为是一个实体

关键字extern和static用于改变标识符的链接属性,如果某个标识符是external属性的,加上static会被改为internal属性,但是static只对确性条件下为external属性的标识符才会起到改变连接属性的作用

extern指的是为一个标识符声明为external链接属性

但是extern只在第一次声明有效,如果又多次对同一个标识符进行声明extenr类型,只要第一次会起到效果

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

存储类型

变量的存粗类型是指存储变量值得内存类型,有3个地方可以存粗变量,普通内存,堆栈,硬件寄存器

变量的缺省存粗类型取决于他的生命位置,凡是代码快之外的标识符都存放在静态内存中static,,在代码快内部申明的变量都存放在堆栈中,称为自动变量auto

**********修改代码的存储类型并不代表修改了标识符的作用域

**********函数的参数不能声明为静态的,因为实参寄存于堆站中,实参要向形参中传参

最后,关键字register可以用于自动变量的声明,提示他们应该存在寄存器中,这类变量也称为寄存器变量,通常寄存器变量的访问往往比内存的访问效率高,但编译器并不一定那么做,如果resister类型的变量过多,编译器只是选择前几个进行声明,其他的补多关心,

static关键字:

当他用于定义函数或者定义代码快之外的变量时候,static只是改变了关键字的连接属性,并不改变作用域和存储类型

当他定义在代码块的局部变量的时候,static改变了存粗类型,,但是链接属性和作用域并没有改变

原文地址:https://www.cnblogs.com/13224ACMer/p/5582613.html