您的位置:首页 > 编程语言 > C语言/C++

C语言提高之——C语言中的作用域、链接属性和存储类型

2015-05-03 17:19 267 查看
    以下的一些博客是我在学习《C和指针》这本书的过程中对一些新的收获的总结和记录,也是对大家学习的一个参考,如果发现有疑问的地方可以参考这本书,同时发现其中有误的地方也可以给予评论指出,是对我的帮助也是对后来学习者的帮助。下边就C语言中的标识符的作用域、链接属性和变量存储类型做一定的分析介绍。

阐述与分类:

作用域:

    当变量在程序中声明后时,它只有在一定区域内才能被访问,这个区域就是由其作用域决定的,作用域分为4种:文件作用域、函数作用域、代码块作用域和原型作用域。

    1、  文件作用域:代码块之外声明的标识符具有文件作用域。

    2、  函数作用域:它只适用于goto语句的语句标签,尽量不要用这一项。

    3、  代码块作用域:在代码块开始位置声明的标识符具有代码块作用域。

    4、  原型作用域:在函数原型中声明的参数名具有原型作用域。

 

链接属性:

    链接属性是为了说明在不同文件中出现的相同标识符应该如何处理。链接属性分为3类:external(外部)、internal(内部)和none(无)。

    1、  external(外部):表示位于不同的源文件的相同标识符表示同一个实体。

    2、  internal(内部):表示只有位于相同源文件的相同标识符表示同一个实体,不同源文件的相同标识符表示不同的实体。

    3、  none(无):表示该标识符的多个声明表示独立的不同实体。

 

存储类型:

    存储类型是指存储变量的值的内存类型。有三个地方可以存储变量:普通的内存、运行时堆栈和硬件寄存器。

    1、  在代码块之外声明的变量总存储于静态内存。

    2、  在代码块内部声明的变量缺省存储于堆栈中,该变量被定义为自动变量;函数的形参不能为静态的,因为实参需要在堆栈中传递给函数。

    3、  要使变量存储于寄存器声明自动变量时需要关键字:register。

 

关键字说明:

    static:该关键字只对缺省链接属性为external的声明才有效果。1、当该关键字用于函数定义或用于代码块外的变量声明时,它会将标识符的链接属性从external改为internal。2、当用于代码块内部的变量声明时,它会将变量的存储类型从自动变量修改为静态变量。

    extern:它用来为一个标识符指定external的链接属性。这样它就可以访问其他任何位置定义的这个实体(一般是用来引用其他源文件中的变量)。但是该作用只适用于该标识符在源文件中的第一次声明。

    说明:static和extern可以改变标识符的链接属性,但是不改变这些标识符的作用域。

 

 

关系:



    对于他们之间在代码中的关系,我做了上边一张图,对于在代码块外部声明的变量存储方式为静态的,声明的标识符具有文件作用域。对于在代码块内部声明的变量存储方式默认为在堆栈存储,声明的标识符具有代码块作用域。对于在代码块内或代码块外部都有可能出现的情况,例如函数:函数声明的标识符为静态存储的,但是对于其形参是存储于堆栈中的,形参声明的变量作用域为原型作用域。对于存储于堆栈中的变量,即自动变量可以用register关键字使变量存储于机器硬件寄存器中。在代码块内部声明的自动变量可以通过static关键字修改为静态变量。

    代码中的全局变量默认链接属性为external,通过static关键字可以使其链接属性该为internal;其他的标识符为none,但是对于那些对函数的调用和通过extern引用的变量来说,这些标识符就是external类型的。

 

总结:

    这些只是编程中的一些基本知识,最重要的是要运用,有这个理论支持的基础上在编程的过程中去发现问题,单纯的了解理论知识是没有大用处的,只有理论知识同实际的操作去结合才可以掌握真正的所谓的技术知识。希望本篇博客对你有所帮助!!   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐