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语言 malloc 源码详解,dlmalloc源码剖析之:mALLOc

/*如果你使用linux, douglea malloc已经默认作为glibc的malloc,新的版本可能用的是ptmalloc(dlmalloc的多线程版本)如果你用的bsd4.2及以前系统libc用的kingsley的malloc;BSD(包括freebsd,netbsd,openbsd)4.2以后版本libc用的是PHKmalloc;如果你用的windows系统用的是microsoft…

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

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

求10 翻译c语言,求助:谁能帮我翻译下最基础的C语言,我是新手,谢谢了!

main(){int i,j,p,q,s,n,a[11]{127,3,6,28,54,68,87,105,162,18};/*定义i,j,q,p,s,n和a[11]&#xff0c;并对a数组赋值*/for(i0;i<10;i){pi;qa[i];/* 用p存储i的数值&#xff0c;也就是记住数组的下标。用q记录a[i]的数值&#xff0c;用作比较 */for(ji1;j<10;j)if(qif(p…

c语言之优先级 结合性与自增运算,C语言之优先级、结合性与自增运算

优先级、结合性这些概念在初学的时候并没有放在心上&#xff0c;今天又碰到这个问题&#xff0c;查了不少资料&#xff0c;再次做个总结。在标准C语言的文档里&#xff0c;对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是&#xff1a;它是仲裁者&#xff0c;在几个…

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

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

android动态改变菜单栏,Android动态设置主题(使用RxBus模式)

之前写过一篇文章&#xff1a;RxBus的实现及简单使用。今天我们尝试使用RxBus动态切换主题。一、定义主题颜色color.xml#F44336#D32F2F#F44336#E91E63#C2185B#E91E63#795548#5D4037#795548#2196F3#1976D2#2196F3#607D8B#455A64#607D8B#FFEB3B#FBC02D#FFEB3B#673AB7#512DA8#673A…

android 图片分析,Android图片处理实例分析

本文实例讲述了Android图片处理的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;package cn.szbw.util;import Android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.…

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

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

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

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

android音乐播放器案例,Android MediaPlayer实现音乐播放器实例代码

Android MediaPlayer实现音乐播放器1、布局文件android:layout_width"fill_parent"android:layout_height"fill_parent"android:orientation"vertical" >android:id"id/hint"android:layout_width"wrap_content"android:…

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

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

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

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

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

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

android switch 未定义,在switch语句中初始化时未定义的变量?

问题本身就是一个明显的答案.无论如何,这是我的代码片段......switch(cSet)...case 8:{ //Special CharactersfinalSet special;char* charSet new char[special.size() 1];charSet[special.size()] 0; //Append null terminatormemcpy(charSet, special.c_str(), special.…

android 克隆对象,克隆会破坏单例对象吗?

假设有这样一个场景&#xff0c;如果复制的目标对象恰好是单例对象&#xff0c;那会不会破坏单例对象呢&#xff1f;当然&#xff0c;我们在已知的情况下肯定不会这么干&#xff0c;但如果发生了意外怎么办&#xff1f;不防来修改一下代码。public class ConcretePrototype imp…

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

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

adb 更新 android sdk,[转载]安装Android时SDK AVD MANAGER时更新报错的解决办法

最近安装Android SDK时&#xff0c;发现更新时出现“A folder failed to be renamed ormoved.”等类似错误。经过测试和G后发现解决办法目前有两种情况&#xff1a;1、确实是因为打开了相关目录或者其他程序占用率文件夹句柄。关闭相关资源管理器或者关闭相关程序即可&#xff…

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

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

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

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

elctron项目_electron项目结构介绍

#项目结构my-project├─ .electron-vue(webpack配置文件)│ └─ build.js(生产环境构建代码)│ └─ dev-client.js(热加载相关)│ └─ dev-runner.js(开发环境启动入口)│ └─ webpack.main.config.js(主进程配置文件)│ └─ webpack.renderer.config.js(渲染进程配…