《C和指针》笔记14: 作用域和存储类型总结(例子说明)

文章目录

  • 题目
  • 答案
  • 解释
  • 总结

本文是作用域和存储类型的总结,以一个例子来说明,如果不看解释可以很直接地回答每一条语句的作用域和存储类型,那么说明已经很熟练地掌握这个知识点了。

关于作用域和存储类型可以参考我前面的博客:

《C和指针》笔记10:作用域
《C和指针》笔记12: 存储类型(自动变量、静态变量和寄存器变量)

题目

请看下面的代码,回答每一行的标识符的链接属性、存储类型和作用域
在这里插入图片描述

答案

行数标识符链接属性存储类型作用域
1aexternal静态存储第1-第12行,第17-第29行
2bexternal静态存储第2-第6行,第25-第29行
3cinternal静态存储第3-第29行
4dexternal静态存储第4行-文件结束
4eexternal自动存储第6-11行,第17-19行以及第23-24行
6f不具有链接属性自动存储至函数结束
7b不具有链接属性寄存器存储至函数结束
8g不具有链接属性静态存储至函数结束
9aexternal静态存储和第一行的a一样
12e不具有链接属性自动存储延伸至16行
13g不具有链接属性自动存储延伸至16行
14hexternal静态存储当前的代码块
19x不具有链接属性自动存储当前的代码块
20e不具有链接属性自动存储当前的代码块
25iinternal静态存储从它声明的位置直到这个源文件结束

解释

  • 第1行的a
    • 链接属性: external,因为它属于文件作用域的声明在缺省情况下为external链接属性,可以被其他源文件访问。
    • 存储类型静态存储
    • 作用域第1-第12行,第17-第29行。静态变量在程序执行之前创建,并一直保持它们的值,直到程序结束。当程序开始执行时,变量a将初始化为5。其作用域应一直延伸到这个源文件结束为止。但是第13行出现的a的局部变量将隐藏同名的静态变量。
  • 第2行的b
    • 链接属性: external,如果b的定义在其他地方,第2行的extern关键字在技术上并非必需,但在风格上却是加上这个关键字为好,可以被其他源文件访问。
    • 存储类型静态存储
    • 作用域第2-第6行,第25-第29行。静态变量在程序执行之前创建,并一直保持它们的值,直到程序结束。其作用域应一直延伸到这个源文件结束为止。 但是由于第7行出现的b的局部变量将隐藏同名的静态变量。
  • 第3行的c
    • 链接属性: internalstatic关键字修改了c的缺省链接属性,把它改为internal。只能被当前的源文件访问。
    • 存储类型静态存储
    • 作用域第3-第29行。静态变量在程序执行之前创建,并一直保持它们的值,直到程序结束。其作用域应一直延伸到这个源文件结束为止。
  • 第4行的d
    • 链接属性: external。作为函数名,d在缺省情况下具有external链接属性,所以其他源文件只要在文件上存在d的原型 ,就可以调用d。函数d的定义对于这个源文件中任何以后想要调用它的函数而言起到了函数原型的作用,如果我们将函数声明为static,就可以把它的链接属性从external改为internal,但这样做将使其他源文件不能访问这个函数。
    • 存储类型静态存储。对于函数而言,存储类型并不是问题,因为代码总是存储于静态内存中。
    • 作用域第4行直到文件结束。静态变量在程序执行之前创建,并一直保持它们的值,直到程序结束。其作用域应一直延伸到这个源文件结束为止。
  • 第4行的e
    • 链接属性: 不具有链接属性,所以我们只能从函数内部通过名字访问它。
    • 存储类型自动存储。在函数被调用时被创建,当函数返回时消失。
    • 作用域第6-11行,第17-19行以及第23-24行。与局部变量冲突导致了作用域的变化。
  • 第6行-第8行的f,b,g
    • 链接属性: 不具有链接属性,所以它们不能在函数的外部通过名字访问(这是它们称为局部变量的原因)
    • 存储类型
      • f是自动存储,当函数每次被调用时,它通过隐式赋值被初始化为15。
      • b是寄存器存储,所以它的初始值是垃圾。
      • g是静态存储,在程序的整个执行过程中一直存在。当函数每次被调用时,它并不会被重新初始化。
    • 作用域到函数结束为止。由于与局部变量冲突,它的作用域限于。
  • 第9行的a
    • 它的声明并不需要。这个代码块位于第1行声明的作用域之内。所以它和第一行的a的连接属性、存储类型都是一样的。
  • 第12行的-第13行的e,a
    • 链接属性: 不具有链接属性,和先前声明的a和e不同,在这个代码块中,以前声明的同名变量是不能被访问的。
    • 存储类型自动存储
    • 作用域延伸至第16行
  • 第14行的h
    • 链接属性: external。相当一个全局变量。这是唯一一个必须使用extern关键字的声明,如果没有它,h将变成另一个局部变量。
    • 存储类型静态存储
    • 作用域当前的代码块
  • 第19和20行的x,e
    • 链接属性: 不具有链接属性,和先前声明的a和e不同,在这个代码块中,以前声明的同名变量是不能被访问的。
    • 存储类型自动存储
    • 作用域当前的代码块

这里的e和第4行函数的形参e是不同的变量,它和第12行声明的e也不相同。在这个代码块中,从第11行到第18行并无嵌套,所以编译器可以使用相同的内存来存储两个代码块中不同的变量e。如果想让这两个代码块中的e表示同一个变量,那么你就不应该把它声明为局部变量

  • 第25行的i
    • 链接属性: internal,该属性可以防止它被这个源文件之外的任何函数调用。其他的源文件也可能声明它自己的函数i,但它与这个源文件的i是不同的函数。
    • 存储类型静态存储
    • 作用域从它声明的位置直到这个源文件结束

函数d不可以调用函数i,因为在d之前不存在i的原型。

总结

具有external链接属性的实体在其他语言的术语里称为全局(global)实体,所有源文件中的所有函数均可以访问它。只要变量并非声明于代码块或函数定义内部,它在缺省情况下的链接属性即为external。如果一个变量声明于代码块内部,在它前面添加extern关键字将使它所引用的是全局变量而非局部变量。除了实体的具体定义位置之外,在它的其他声明位置都使用extern关键字。

具有external链接属性的实体总是具有静态存储类型。全局变量在程序开始执行前创建,并在程序整个执行过程中始终存在。从属于函数的局部变量在函数开始执行时创建,在函数执行完毕后销毁,但用于执行函数的机器指令在程序的生命期内一直存在。

局部变量由函数内部使用,不能被其他函数通过名字引用。它在缺省情况下的存储类型为自动,这是基于两个原因:

  1. 当这些变量需要时才为它们分配存储,这样可以减少内存的总需求量。
  2. 在堆栈上为它们分配存储可以有效地实现递归。

如果觉得让变量的值在函数的多次调用中始终保持原先的值非常重要的话,可以修改它的存储类型,把它从自动变量改为静态变量。

变量类型声明的位置是否存在于堆栈作用域如果声明为static
全局所有代码块之外从声明处到文件尾不允许从其他源文件访问
局部代码块起始处整个代码块变量不存储于堆栈中,它的值在程序整个执行器一直保持
形式参数函数头部整个函数不允许

参考

  1. 《C与指针》

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

抖店出单后怎么操作?谈厂家话术与发货注意事项,抖店最新教程

我是王路飞。 当你的抖店出单后,你是怎么操作的? 还是像之前那样去拼多多代拍发货?这样做的商家,不知道你的店铺被封了几个了? 记住,现在抖店出单后,一定不要再去多多拍单发货了! 关于抖店…

京东广告典型源码示例二

广告资源链接 http://x.jd.com/exsites?spread_type2&ad_ids208:5&location_info0&callbackgetjjsku_callback 相应的源码如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-t…

基于Django的博客管理系统

1、克隆仓库https://gitee.com/lylinux/DjangoBlog.git 若失效&#xff1a;https://gitee.com/usutdzxy/DjangoBlog.git 2、环境安装 pip install -Ur requirements.txt3、修改djangoblog/setting.py 修改数据库配置&#xff0c;其他的步骤就按照官方文档。 DATABASES {def…

【Java基础】Java注解与反射

文章目录 ⭐️写在前面的话⭐️1、什么是注解&#xff1f;注解的分类常用的Java注解 2、元注解TargetRetentionDocumentedInherited 3、自定义注解Override注解的基本格式 4、什么是反射&#xff1f;什么时候需要用到反射&#xff1f;反射的应用场合 5、反射的原理6、反射机制的…

0201hdfs集群部署-hadoop-大数据学习

文章目录 1 前言2 集群规划3 hadoop安装包上传与安装3.1 上传解压 4 hadoop配置5 从节点同步和环境变量配置6 创建用户7 集群启动8 问题集8.1 Invalid URI for NameNode address (check fs.defaultFS): file:/// has no authority. 结语 1 前言 下面我们配置下单namenode节点h…

字节面试杂谈——操作系统

目录 一、操作系统的定义 二、系统调用、用户态和核心态 三、进程和线程的区别&#xff0c;结合JAVA JVM运行时内存 四、进程的状态 五、进程间的通信方式 六、线程间的同步方式 七、进程的调度算法 八、内存管理的介绍、常见的几种内存管理机制 九、快表、多级页表 …

自己动手写操作系统 ----总计

2021.1.23 开始写操作系统 好奇心是动力的源泉&#xff0c;追究问题的本质是优秀黑客的必备素质,只有充分掌握了系统原理&#xff0c;才能在技术上游刃有余&#xff0c;才能有真正的创新和发展。中国需要更多真正的黑客&#xff0c;也希望更多的程序员能享受属于黑客的创造乐趣…

ubuntu学习(六)----文件编程实现cp指令

1 思路 Linux要想复制一份文件通常指令为&#xff1a; cp src.c des.c 其中src.c为源文件&#xff0c;des.c为目标文件。 要想通过文件编程实现cp效果&#xff0c;思路如下 1 首先打开源文件 src.c 2 读src到buf 3 创建des.c 4 将buf写入到des.c 5 close两个文件 2 实现 vi …

比较重合点的排斥能

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让A中有2个1&#xff0c;B中有1个1&#xff0c;有一个点重合&#xff0c;排列组合&#xff0c;统计迭代次数并排序。 得到数据 构造平均列A 构造平均列…

k8s 查看加入主节点命令 k8s重新查看加入节点命令 k8s输入删除,重新查看加入命令 kuberadm查看加入节点命令

1. 使用kuberadm 安装成功后&#xff0c;clear清除了屏幕数据&#xff0c;加入命令无法查看&#xff0c;使用如下&#xff0c;重新查看node如何加入主节点命令&#xff1a; kubeadm token create --print-join-command --ttl 0 2.画圈的全部是&#xff0c;都复制&#xff0c;在…

4.22 TCP 四次挥手,可以变成三次吗?

目录 为什么 TCP 挥手需要四次呢&#xff1f; 粗暴关闭 vs 优雅关闭 close函数 shotdown函数 什么情况会出现三次挥手&#xff1f; 什么是 TCP 延迟确认机制&#xff1f; TCP 序列号和确认号是如何变化的&#xff1f; 在一些情况下&#xff0c; TCP 四次挥手是可以变成 T…

Python让AI虚拟主播接入微软Azure语音合成并精准嘴型同步

上一篇文字中讲了利用Python实现利用微软Azure无限免费将文本转mp3格式的音频文件并下载到本地。微软Azure TTS的优点不用多说&#xff0c;今天将讲如何利用Python将其接入到虚拟主播中来。 订阅专栏&#xff0c;我将免费向您提供具体的方案。 看过专栏其他文章的朋友&#x…

微软HPC解决方案

首先我们先来看下高性能群集与其它几种群集的不同 高可用群集&#xff1a;群集所有节点&#xff0c;来维持一个应用的持续运作&#xff0c;如果当前应用所在节点失败&#xff0c;自动故障转移至其它节点 负载均衡群集&#xff1a;群集所有节点来平衡一个应用的访问请求&#x…

群辉服务器间同步文件,群晖NAS端之间同步(Cloud Station Sharesync)

Cloud Station套件是一个套件组&#xff0c;包含5个功能模块&#xff0c;其中Cloud Station Server是Cloud Station在NAS上的服务器端&#xff1b;云同步(Cloud Station Drive)和云备份(Cloud Station Backup)是电脑端软件&#xff0c;Drive是电脑端和NAS端的双向同步&#xff…

微软同步工具之synctoy

&#xfeff;&#xfeff; synctoy是由 微软 推出的一款免费的文件夹同步工具。微软的软件都以复杂与臃肿著称&#xff0c;不过这款软件还真是摆脱了复杂和臃肿。 &#xff1a;第一項是最主要的雙向同步功能&#xff0c;會依據左右兩端點裡檔案的增加、刪除、修改、更名&#x…

4 hadoop集群配置案例

3&#xff09;配置集群 &#xff08;1&#xff09;核心配置文件&#xff0c;core-site.xml cd $HADOOP_HOME/etc/hadoopvim core-site.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text…

远程桌面同步本地计算机,微软更新远程桌面应用现在终于可以在本地和远程计算机上复制文件...

远程桌面连接是许多专业用户和开发者必备的功能&#xff0c;通过远程桌面服务可以直接连接远程计算机并可以直接操作。 系统自带的远程桌面连接程序微软已经很久没有更新&#xff0c;因为微软现在主要通过应用商店发布新版本远程桌面应用。 比如在刚刚发布的远程桌面应用新版本…

解决 vscode 登录微软账户同步设置 出现“vscode.dev 关闭了连接“ 问题

我的电脑最近重装了系统&#xff0c;之前的软件都删除了&#xff0c;在重新安装vscode之后想同步之前的设置、主题时出现了问题。 我的解决方法是 在当前页面 输入 https://vscode.dev 看能不能打开。 如果能打开&#xff0c;再次点击vscode登录账号同步设置 我之前使用微软账…

跨设备同步保存密码

跨设备同步保存密码 文章目录 跨设备同步保存密码前言一、密码管理方式二、跨设备存储密码1、采用Keepass存储密码2、Keepass连接坚果云 三、小记&#xff1a; 前言 现在网络平台越来越多&#xff0c;除了可以直接通过手机登陆的方式&#xff0c;其次就需要使用到账号和密码。账…