《C和指针》 第三章 数据(2)

来源:互联网 发布:a算法八数码问题 编辑:程序博客网 时间:2024/05/23 00:17

3.5 作用域

     当变量在程序的某部分被声明时,它只能在程序的一定区域才能访问,这个区域就是标识符的作用域;
    作用域分为以下四种:
        文件作用域, 函数作用域, 代码块作用域,原型作用域 四种;
        代码快作用域: 在一个花括号中声明的变量,它的作用域就是从声明位置开始,到花括号结束; 这意味着,花括号外不能在使用该变量, 如果花括号外又同名的变量,外部变量在花括号内生效。 
        因此尽量避免嵌套代码看中使用相同的变量名,
        不是嵌套的代码块可以使用相同的变量,因为作用域不同的,由于代码块的变量不可能同时存在,所以编译器可以把他们存储在同一个内存地址中,
         文件作用域 : 任何在代码块之外声明的标识付都具有文件按作用域, 即从声明之处开始到所在的源文件结尾处都可以访问, 声明的函数也是这样的, 但是定义的函数就要又顺序要求了。如果函数都没有声明,那被调用的函数必须爱调用函数之前定义。
                               #include 导入的头文件,相当于直接写文件中;
    原型作用域 : 只适用于函数原型的声明中,    
                         参数的名字不是必须的,也不必和函数定义中的形参名匹配,也不必和函数实际调用时所传递的实参匹配,  
    函数作用域:  这个很少用的,只适用于标签语句, goto
                            一个函数的所用标签语句必须唯一

3.6 链接属性

    链接属性决定如何处理不同文件中出现的标识符, 标识符的作用域和它的链接属性有关但是不相同
    链接属性分为三种 external , internal none, 
         没有链接属性的none,当做单独的个体,该标识符的多个声明当做独立的不同体
         内部链接属性的internal ,同一个源文件中所有的声明指向一个实体, 不同源文件中多个声明分属不同实体:ps 也就是在同一个文件中可以多次声明一个标识符,但是这个标识符是指向同一个的, 
         外部链接属性的externak,不论声明多少次,位于几个源文件都表示同一个实体;
           static  声明的变量只能在这个文件或函数内使用,不能在其他文件中调用;  问题: 一个函数内定义的static 变量,作用域是这个函数, 但是其他函数或者全局变量中能不能定义同名的变量 ? 
         extern  声明的变量,表示该变量是其他文件中定义的,非本文就中定义
   
3.7 存储类型 
    存储类似是指存储变量值的内存类型,变量存储类型决定了变量何时创建,销毁,保持多久; 同时又分为一下三种:普通内存,运行时堆栈, 硬件寄存器;硬件寄存器很少用到;  
   普通缺省的存储类型取决于声明的位置: 声明在代码块之外的变量,总是存储在静态内存中 ,程序运行前创建,程序结束后销毁; 问题: 如果在代码块外声明为auto ,会怎样? 编译不通过,还是改变存储类型?
    在代码块中声明的缺省变量,存储在运行是的堆栈中,成为自动变量,可以使用关键字auto,当程序指向到代码块时,这个变量才创建,代码块结束后,自动变量销毁,多次调用代码块,自动变量多次创建。在内存中位置可能相同,也可能不同,
    在代码块中声明的变量加一个static ,由自动存储类型变为静态的,静态存储类型在整个程序执行过程中,一直存在,但是整个修改依然不能修改变量的作用域,依然只能在代码块内部访问; 函数形参不能声明为静态的
    关键字register 可用于自动变量声明,只后自动变量存储爱硬件寄存器中,而不是内存中, 这类变量称为寄存器变量, 寄存器变量访问效率比存储在内存中的效率高,但是声明为寄存器变量不一定有用, 1. 声明太多,只会选择其中几个,剩余的是安装普通自动变量; 2, 如果寄存器又优化方案,可以自己决定那个设置为寄存器
    疑问: 看这个说明,只有自动变量可以,静态变量不能声明为寄存器变量?

    初始化:自动变量的初始化和静态变量初始化的区别
         静态变量初始化: 初始化值可以放在任何位置,当可执行文件载入内存时,保证了正确初始值的位置讲赋值给静态变量,不需要额外花销, 如果不显示指定初始化值,静态变量初始化为0;
        自动变量初始化: 需要更大的开销,因为链接时无法判断自动变量的存储位置,每次调用可能占据不同的位置,因此没有缺省的初始值,显示初始化,是在代码块起始处隐式的赋值了一下;
    


3.8 static 关键字
   当static 用于函数定义,代码块之外变量的声明时,static 只修改了链接属性,只允许在源文件内部访问,但是存储类型和作用域不受影响
   当static 用于代码块内部时,存储类型由自动变量变为静态变量,链接属性和作用域不受影响,并且在程序执行前创建,程序结束后销毁,而非代码块执行结束。

0 0
原创粉丝点击