c语言之函数存储属性,C语言:链接属性与存储类型

一、 链接属性

C语言中链接属性决定如何处理在不同文件中出现的标示符。标示符的作用域与它的链接属性有关,但这两个属性并不相同。

链接属性有3种: external(外部),internal(内部) 和 none(无)。

1. none: 没有链接的标示符,总是被当做单独的个体,也就是说改标示符的多个声明被当做不同的实体。

2. internal: 在同一个源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。

3. external: 标示符不论声明多少次,位于几个文件都表示同一个实体。

举一个简单的例子对链接属性进行说明,如下图:

100648611_1

1. 在缺省情况下,标示符b,c,f 的链接属性为external, 其余标示符的链接属性则为none。因此,另一个源文件也包含了标示符b的类似声明并调用函数c,他们实际上访问的是这个源文件所定义的实体。f的链接属性之所以是external,是因为它是函数名。这个源文件中调用f,实际上将链接到其他源文件所定义的函数,甚至这个函数的定义可能出现在某个函数库。

2. 关键字extern和static用于在声明中修改标示符的连接属性。如果某个声明在正常情况下具有external链接属性,在它前面加上static关键字可以使它的链接属性变为internal。例如,将b声明为

static int b;那么变量b就将为这个源文件所私有。在其他源文件中,如果也链接到一个叫做b的变量,那么它所引用的是另一个不同的变量。

3. static只对缺省链接属性为external的声明才有改变链接属性的效果。例如,你尽管可以在变量e前面加上static关键字,但它的效果完全不一样,因为e的缺省链接属性不是external。

二、 存储类型

变量的存储类型是指存储变量值的内存类型。有三个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。变量的缺省存储类型取决于它的声明位置。

1. 凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量称为静态(static)变量。静态变量在程序运行之前创建,更确切的说,是在将可执行文件加载到内存的时候创建,其在程序的整个执行期间始终存在。

2. 在代码块内部声明的变量的缺省存储类型是自动的(automatic), 也就是说它存储于堆栈中,称为自动变量。有一个关键字auto就是用于修饰这种存储类型的,但它极少使用,因为代码块中的变量缺省情况下就是自动变量。在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开代码块时,这些自动变量便自行销毁。在代码块内部声明的变量,如果给它加上static,可以使它的存储类型从自动变为静态。注意,修改变量的存储类型并不表示修改改变量的作用域。它任然只能在该代码块内部按名字访问。函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数。

3. 关键字register可以用于自动变量的声明,提示它们应该存储于机器的硬件寄存器而不是内存中。

三、 static关键字使用说明

注意到在“连接属性”和“存储类型”中都有可能使用到static关键字,因为我们有必要搞清楚在不同情况下,static关键字的作用。

1. 当它作用于函数定义时,或者用于代码块之外的变量声明时,static关键字用于修改标示符的链接属性。

从external改为internal,但标示符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。

2. 当它作用于代码块内部的变量声明时,static用于修改变量的存储类型。

从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在。

四、 作用域、存储类型示例

我们就以下面的示例代码进行说明。

100648611_2

1. 第1行a的链接属性为external,第二行extern在技术上并非必要,第三行的static关键字修改了c的缺省链接属性,把它改为internal。声明了变量a和b(具有external链接属性)的其他源文件在使用这两个变量时实际所访问的是声明与此处的这两个变量。但变量c只能由这个源文件访问,因为它具有internal链接属性。

2. 变量a,b,c 的存储类型为静态,表示它们并不存储于堆栈中。因此,这些变量在程序执行之前创建,并一直保持它们的值,直到程序结束。

3. 第4行声明了两个标示符,d的作用域从第四行直到文件结束。对于函数而言,存储类型不是问题,因为代码总是存储在静态内存中的。参数e不具有链接属性,所以我们只能从函数内部通过名字访问它。

4. 第6~8行声明局部变量,所以它们的作用域到函数结束为止,它们不具有链接属性,所以它们不能在函数的外部通过名字访问。变量g的存储类型是静态,所以它在程序的整个执行过程中一直存在。当程序开始执行时,它被初始化为20。当函数每次被调用时,它并不会被重新初始化。

5. 第9行的声明并不需要,这个代码位于第1行声明的作用域之内。

6. 第12,13行代码块声明为局部变量。它们都具有自动存储类型,不具有链接属性。

7. 第14行使全局变量h在这个代码块内可以被访问。它具有external链接属性,存储于静态内存中。

8. 第19,20行用于创建局部变量。

9. 第25行声明了函数i,它具有静态链接属性。

五、 作用域、链接属性和存储类型总结

100648611_3

六、 变量存储区域分配图

大家可以根据上述示例代码,将变量一一对应的放到指定的区域。

100648611_4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数数C语言,(旧)子数涵数·C语言——让C帮你做计算

之前,我们学过了我们的第一个C程序——hello World。现在开始进一步学习,想一想如何让C帮你做计算。我们先来看代码(我没有新建,还是用之前的hello world.cpp):好,因为之前在hello World的时候就已经学过了C的基本框架…

android设置输入框输入字符限制,Android EditText限制输入字符的方法总结

Android EditText限制输入字符的方法总结最近项目要求限制密码输入的字符类型, 例如不能输入中文。 现在总结一下EditText的各种实现方式, 以比较各种方法的优劣。第一种方式: 设置EditText的inputType属性,可以通过xml或者Ja…

android开发按钮颜色,Android编程实现简单设置按钮颜色的方法

本文实例讲述了Android编程实现简单设置按钮颜色的方法。分享给大家供大家参考,具体如下:1.工程目录a.在res目录-新建drawble文件夹放入自定义图片2.main.xmlandroid:orientation"vertical"android:layout_width"fill_parent"androi…

艾默生变频器ev1000故障代码_国产变频器型号大全,梳理国产变频的前世今生!...

在工控领域,变频器已经广为所知且应用范围广泛,各方对变频器能给出形形色色的描述。维基百科给出的定义:“变频器(variable frequency drive,常见缩写VFD),也称为变频驱动器或驱动控制器。变频器是可调速驱动系统的一种…

单边指数信号的特点_今日股市分析:上证指数若能守住3400,蓄力反弹就有戏...

昨日整体概况上涨:848只 下跌:3009只涨停:69只 跌停:12只昨天的上证指数低开低走,午后冲红又回落,另一边的创业板却是单边下行跌超3%,板块方向农业、洪水概念股、还有电力板块较强。按照昨日置顶…

万丰科技机器人排名_机器人系统集成“7宗最”

摘要:对于众多集成商而言,作为典型的“夹心饼奥利奥”,面对客户的各种要求,“不敢勉强你,只好为难自己”系真实写照。1、企业数量最多GGII统计数据显示,截至2019年年底,中国工业机器人产业企业数…

android 电池高温关机,Android 关机问题分析指南

本篇文章主要介绍 Android 开发中的 关机 部分知识点,通过阅读本篇文章,您将收获以下内容:1 . 确认是亮屏关机还是灭屏关机?关机时是否有播放关机动画?2 . 是直接关机还是关机后会自动重启?3.异常关机时,连…

转网口显示未识别的网络_已有1700万用户携号转网 超99%用户1小时内办结

携号转网是利国利民的大举措,受到了很多电信用户的拥护和支持。12月15日,工信部副部长刘烈宏在某会议上进行报告指出,目前我国 “携号转网”服务已经累计有 1700 万用户完成携转,一小时携转成功办结率超过 99%。已有1700万用户携号…

2020.2idea怎么创建html项目_陈肆横项目日记:百度百科怎么创建自己的名字

百度百科是一个介绍人物很好的平台,很多的都想创造属于自己的百度百科。而人物百科词条,是百度百科专门为知名人物提供个人信息展示的平台。创建一个属于自己的百度百科词条,就相当于拥有了一张名片,不仅有着影响力与知名度的传播…

android c++ gizp 调用 so,使用ndk-build编译 android调用的so库

前沿编译so的方法有两种方法第一种就是编写原生的makefile文件利用gcc进行编译,这里我讲解的是另外一种。采用NDK提供的ndk-build编译。简介使用ndk编译的时候需要介绍它的脚本文件,Android.mk和Application.mk,但是Application.mk是可选的,用…

html5判断多选框是否选择的函数,复选框(checkbox)、多选框

1、需求分析可同时选中多个选项,实现全选、全不选、反选等功能。2、技术分析基础的HTML、CSS、JavaScript。3、详细分析3.1 HTML部分图示是一个列表加底部一段文字说明,列表包含三个部分,整体是一个多选列表,上部是总的选项&#…

layer调用父页面方法_Ruby for SketchUp之图层【Layer】

我们学习了群组、组件及组件定义,今天来看看图层【Layer】,在Sketchup2020版本中已经更名为“标记”,如图那么图层在我们建模过程中能带来哪些便利呢?可以快速的隐藏同一图层内所有东西,而不需要逐一选择并右键点击隐藏…

html盒子有哪些属性,盒子模型有哪些属性 在html5中哪些元素具有盒子模型

HTML盒模型基本属性有哪些CSS盒子模型就是在CSS技术所使用的一种思维模型。CSS假定所有的HTML文档元素都生成一个描述该元素在HTML文档布局中所占空间的矩形元素框,可以形象地将其看作是一个盒子。通过定义一系列与盒子相关的属性,可极大地丰富和促进各个…

huffman编码的程序流程图_F28379D之CLB解码多摩川编码器2——LIB版例程讲解(原创)...

我在第一篇文章中已经跟大家介绍过379解码多摩川编码器的一些入手小知识,链接如下TMS320F28379D之CLB解码多摩川编码器1——入手小知识(原创)请大家一定要看入手小知识,再来看例程分析。今天跟大家分析一下TI的官方例程。首先&…

html统计表合并单元格的快捷键,word怎样设置合并单元格快捷键

word2010中合并单元格的快捷键是什么?求解答。合并单元格没有快捷键,不过有个f4是重复上一步操作,所以你要合并多个单元格,那么你可以先点一合并单元格,然后选定你要合并的区域。WORD合并单元格的快捷键怎么设置word合并单元格快…

fcm 服务器接入 golang_Golang 写的即时通讯服务器 im(服务组件形式)

简要介绍im是一个即时通讯服务器,代码全部使用golang完成。主要功能1.支持tcp,websocket接入2.离线消息同步3.单用户多设备同时在线4.单聊,群聊,以及超大群聊天场景5.支持服务水平扩展gim和im有什么区别?gim可以作为一…

html 手机分辨率,移动端各种分辨率手机屏幕----适配方法集锦

1.使用viewport,html文件中在内添加meta,简单粗暴:2.加判断复杂点的viewport,可以封装成一个js,每次新建html时调用.js即可:var phoneWidth parseInt(window.screen.width);var phoneScale phoneWidth/75…

橡胶支座抗压弹性模量计算公式_隔震支座的这些力学特性您都掌握了吗?

隔震支座叠层橡胶隔震支座,是隔震设计中应用最为广泛的隔震装置。了解隔震支座的力学特性,在软件中设置正确的参数,是做好隔震设计最基本的前提。那么,隔震支座的这些特性您都掌握了吗?叠层橡胶隔震支座叠层橡胶隔震支…

asp.net button创建控件时出错_Tkinter Radiobutton控件

单选按钮是一种可在多个预先定义的选项中选择出一项的 Tkinter 控件 。单选按钮可显示文字或图片,显示文字时只能使用预设字体,该控件可以绑定一个 Python 函数或方法,当单选按钮被选择时,该函数或方法将被调用。单选按钮&#xf…

计算机师范类算师范教育类吗,师范教育类专业和计算机类专业,两者相比,哪个更适合自考生报读...

原标题:师范教育类专业和计算机类专业,两者相比,哪个更适合自考生报读一、师范教育类专业大部分毕业生的就业方向都是在教育行业,互联网的发展,教学教育有了网络课,让人们随时随地都可以学习,也…