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

news2024/11/24 13:30:37

文章目录

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

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

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

《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://www.coloradmin.cn/o/937706.html

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

相关文章

LeetCode-56-合并区间

题目描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 可以使用 LinkedList,…

Cadence+硬件每日学习十个知识点(46)23.8.26 (运算放大器)

文章目录 1.电压跟随器的输入和输出是一样的,但是输入的是电压带有高阻抗,输出的电压带有低阻抗。2.比较器的迟滞(这个电阻)3.运放的压摆率4.运放-轨到轨5.输入失调电压Vos(选一个低的器件就行,对于5V&…

Batbot电力云平台在智能配电室中的应用

智能配电室管理系统是物联网应用中的底层应用场景,无论是新基建下的智能升级,还是双碳目标下的能源管理,都离不开智能配电运维对传统配电室的智慧改造。Batbot智慧电力(运维)云平台通过对配电室关键电力设备部署传感器…

【学习笔记】求解线性方程组的G-S迭代法

求解线性方程组的G-S迭代法 // 运行不成功啊function [x,k,index] Gau_Seid(A,b,ep,it_max) % 求解线性方程组的G-S迭代法,其中 % A为方程组的系数矩阵 % b为方程组的右端项 % ep为精度要求,省缺为1e-5 % it_max为最大迭代次数,省缺为100 % …

1. 深度学习介绍

1.1 AI地图 ① 如下图所示,X轴是不同的模式,最早的是符号学,然后概率模型、机器学习。Y轴是我们想做什么东西,感知是我了解这是什么东西,推理形成自己的知识,然后做规划。 ② 感知类似我能看到前面有个屏…

微前端开发

微前端介绍 微前端的概念是由ThoughtWorks在2016年提出的,它借鉴了微服务的架构理念,核心在于将一个庞大的前端应用拆分成多个独立灵活的小型应用,每个应用都可以独立开发、独立运行、独立部署,再将这些小型应用融合为一个完整的…

【大数据】Linkis:打通上层应用与底层计算引擎的数据中间件

Linkis:打通上层应用与底层计算引擎的数据中间件 1.引言2.背景3.设计初衷4.技术架构5.业务架构6.处理流程7.如何支撑高并发8.用户级隔离度和调度时效性9.总结 Linkis 是微众银行开源的一款 数据中间件,用于解决前台各种工具、应用,和后台各种…

【git进阶使用】 告别只会git clone 学会版本控制 ignore筛选 merge冲突等进阶操作

git使用大全 基本介绍git 快速上手一 环境安装(默认已安装)二 远程仓库克隆到本地1 进入rep文件夹目录2 复制远程仓库地址3 git clone克隆仓库内容到本地4 修改后版本控制4.1 修改文件4.2 git status查看版本库文件状态4.3 git add将文件加入版本库暂存区…

NEOVIM学习笔记

GitHub - blogercn/nvim-config: A pretty epic NeoVim setup 一直使用vim,每次到了新公司都要配置半天,而且常常配置失败,很多插件过期不好用。偶然看到别人的NEO VIM,就试着用了一下,感觉还不错。 用来开发和阅读C代…

使用树莓派Pico、DHT11和SSD1306搭建一个温度湿度计(只使用官方库,以及官方案例代码的错误之处和解决方案)

最近想树莓派 Pico、DHT11 温湿度传感器和 SSD1306 OLED 屏幕做一个温度湿度计,树莓派官方案例也分别有这两个设备的案例,我就想做个简单的温度湿度计作为学习微控制器的开始,结果遇到了一个大坑,所以写本文记录一下整个过程。 本…

[完美解决]Vue项目运行时出现this[kHandle] = new _Hash(algorithm, xofLen)

vue项目运行bug解决办法 一、问题内容二、问题出现的原因三、解决方法1、方法一(推荐)2、方法二(可以解决,但不太推荐) 一、问题内容 在github寻找一些vue项目clone到本地时候,npm i没有问题,但是npm run serve 或者npm run dev的时候会出现…

计算机毕设 基于机器学习的餐厅销量预测 -大数据 python

文章目录 0 前言餐厅销量预测模型简介2.ARIMA模型介绍2.1自回归模型AR2.2移动平均模型MA2.3自回归移动平均模型ARMA 三、模型识别四、模型检验4.1半稳性检验(1)用途(1)什么是平稳序列?(2)检验平稳性 ◆白噪声检验(纯随机性检验)(1)用途(1)什么是纯随机序列?(2)检验纯随机性 五…

LLM本地知识库问答系统(一):使用LangChain和LlamaIndex从零构建PDF聊天机器人指南

随着大型语言模型(LLM)(如ChatGPT和GPT-4)的兴起,现在比以往任何时候都更容易构建比普通熊更智能的智能聊天机器人,并且可以浏览堆积如山的文档,为您的输入提供准确的响应。 在本系列中&#xf…

基于微信小程序的汽车租赁系统的设计与实现ljx7y

汽车租赁系统,主要包括管理员、用户二个权限角色,对于用户角色不同,所使用的功能模块相应不同。本文从管理员、用户的功能要求出发,汽车租赁系统系统中的功能模块主要是实现管理员后端;首页、个人中心、汽车品牌管理、…

LAMP介绍与配置

一.LAMP 1.1.LAMP架构的组成 CGI(通用网关接口)和FastCGI(快速公共网关接口)都是用于将Web服务器与后端应用程序(如PHP、Python等)进行交互的协议/接口。 特点 CGI FastCGI 运行方式 每个请求启动…

【C语言】2023.8.27C语言入学考试复盘总结

前言 本篇文章记录的是对于2023年8月27日的 C语言 的入学考试的整理总结 成绩:220/240 题目:9/12 错题整理 首先先对于我没做出来的三道题做一个整理 错题1:7-4 分段函数PLUS 题干 以下是一个二元分段函数,请你根据所给的函…

列式存储引擎-内核机制-Parquet格式

列式存储引擎-内核机制-Parquet格式 Parquet是一种开源的列式存储结构,广泛应用于大数据领域。 1、数据模型和schema Parquet继承了Protocol Buffer的数据模型。每个记录由一个或多个字段组成。每个字段可以是atomic字段或者group字段。Group字段包含嵌套的字段&…

软件工程(九) UML顺序-活动-状态-通信图

顺序图和后面的一些图,要求没有用例图和类图那么高,但仍然是比较重要的,我们也需要按程度去了解。 1、顺序图 顺序图(sequence diagram, 顺序图),顺序图是一种交互图(interaction diagram),它强调的是对象之间消息发送的顺序,同时显示对象之间的交互。 下面以一个简…

Python WEB框架之FastAPI

Python WEB框架之FastAPI 今天想记录一下最近项目上一直在用的Python框架——FastAPI。 个人认为,FastAPI是我目前接触到的Python最好用的WEB框架,没有之一。 之前也使用过像Django、Flask等框架,但是Django就用起来太重了,各种…

remove elements in c++

https://www.youtube.com/watch?vq5OfB6ZXT6E&listPL5jc9xFGsL8E_BJAbOw_DH6nWDxKtzBPA&index4