一:作用域:
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改变了存粗类型,,但是链接属性和作用域并没有改变