《C和指针》笔记10:作用域

news2024/9/17 9:08:23

在这里插入图片描述
结合上面的例子讲解C语言的作用域。

1. 代码块作用域 (block scope)

位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的标识符都具有代码块作用域 (block scope),表示它们可以被这个代码块中的所有语句访问。上图中标识为6、7、9、10的变量都具有代码块作用域。函数定义的形式参数(声明5)在函数体内部也具有代码块作用域。

当代码块处于嵌套状态时,声明于内层代码块的标识符的作用域到达该代码块的尾部便告终止。然而,如果内层代码块有一个标识符的名字与外层代码块的一个标识符同名,内层的那个标识符就将隐藏外层的标识符——外层的那个标识符无法在内层代码块中通过名字访问。声明9的f和声明6的f是不同的变量,后者无法在内层代码块中通过名字来访问。

应该避免在嵌套的代码块中出现相同的变量名。并没有很好的理由使用这种技巧,它们只会在程序的调试或维护期间引起混淆。

不是嵌套的代码块则稍有不同。声明于每个代码块的变量无法被另一个代码块访问,因为它们的作用域并无重叠之处。由于两个代码块的变量不可能同时存在,所以编译器可以把它们存储于同一个内存地址。例如,声明10的i可以和声明9的任何一个变量共享同一个内存地址。这种共享并不会带来任何危害,因为在任何时刻,两个非嵌套的代码块最多只有一个处于活动状态

2. 文件作用域

任何在所有代码块之外声明的标识符都具有文件作用域 (file scope),它表示这些标识符从它们的声明之处直到它所在的源文件结尾处都是可以访问的。上图中的声明1和2都属于这一类。在文件中定义的函数名也具有文件作用域,因为函数名本身并不属于任何代码块(如声明4)。应该指出,在头文件中编写并通过#include指令包含到其他文件中的声明就好像它们是直接写在那些文件中一样。它们的作用域并不局限于头文件的文件尾

3. 原型作用域

原型作用域 (prototype scope)只适用于在函数原型中声明的参数名,如上图中的声明3和声明8。在原型中(与函数的定义不同),参数的名字并非必需。但是,如果出现参数名,你可以随你所愿给它们取任何名字,它们不必与函数定义中的形参名匹配,也不必与函数实际调用时所传递的实参匹配。原型作用域防止这些参数名与程序其他部分的名字冲突。事实上,唯一可能出现的冲突就是在同一个原型中不止一次地使用同一个名字。

4. 函数作用域

最后一种作用域的类型是函数作用域 (function scope)。它只适用于语句标签,语句标签用于goto语句。基本上,函数作用域可以简化为一条规则——一个函数中的所有语句标签必须唯一。作者希望读者永远不要用到这个知识。


再举个例子

在这里插入图片描述
第一次调用print_time打印的是全局变量的值,第二次直接调用printf打印的则是main函数局部变量的值。这里使用了全局变量,它是定义在所有函数体之外的标识符,它的作用域从定义的位置开始直到源文件结束(对应于上面的文件作用域),而main函数局部变量的作用域仅限于main函数之中(代码块作用域)。如上图所示,设想整个源文件是一张大纸,也就是全局变量的作用域,而main函数是盖在这张大纸上的一张小纸,也就是main函数局部变量的作用域。在小纸上用到标识符hourminute时应该参考小纸上的定义,因为大纸(全局变量的作用域)被盖住了,如果在小纸上用到某个标识符却没有找到它的定义,那么再去翻看下面的大纸上有没有定义,例如上图中的变量x。

参考

  1. 《C和指针》
  2. Linux C编程一站式学习-全局变量、局部变量和作用域

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

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

相关文章

2000-2021年地级市产业升级、产业结构高级化面板数据

2000-2021年地级市产业升级、产业结构高级化面板数据 1、时间:2000-2021年 2、范围:地级市 3、指标:年份、地区、行政区划代码、地区、所属省份、地区生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业占GDP比重、第二…

Nacos配置管理服务

统一配置管理 功能:对配置文件相同的微服务进行配置文件的统一管理。 统一配置管理是解决场景:普通情况下,多个相同功能的微服务实例,更改配置的话得一个一个更改后重启的情况。 核心配置放在配置管理服务中,启动时…

【小沐学Unity3d】3ds Max 骨骼动画制作(Mixamo )

文章目录 1、简介2、基本操作2.1 Characters(角色)2.2 Animations(动画) 3、常见问题FAQ3.1 问题一3.2 问题二 结语 1、简介 官网地址: https://www.mixamo.com/#/ 使用 Mixamo 上传和装配 Adobe Fuse CC 3D 人物、自…

数据结构(Java实现)-栈和队列

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 先进后出 栈的使用 栈的模拟实现 上述的主要代码 public class MyStack {private int[] elem;private int usedSize;public MyStack() {this.elem new int[5];}Overridepublic …

iPhone 15 Pro与谷歌Pixel 7 Pro:哪款相机手机更好?

考虑到苹果最近将更多高级功能转移到iPhone Pro设备上的趋势,今年秋天iPhone 15 Pro与谷歌Pixel 7 Pro的对决将是一场特别有趣的对决。去年发布的iPhone 14 Pro确实发生了这种情况,有传言称iPhone 15 Pro再次受到了苹果的大部分关注。 预计iPhone 15系列会有一些变化,例如切…

G. The Morning Star - 思维

分析: 直接暴力就会tle,不知道怎么下手,可以统计八个方向一条线上的所有坐标,这些坐标一定可以放在一起满足,分析都有哪些线,当横坐标相同时会有竖着的一条线都可以,也就是x c,当纵…

服务器安全-禁止ping

1、临时禁ping #禁ping echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all#启用ping echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all 2.永久禁ping(如果有此配置就无需重复添加,仅更新值即可) #禁ping echo "net.ipv4.icmp_echo_ignore_all1" >>…

【Linux】进程通信 — 信号(上篇)

文章目录 📖 前言1. 什么是信号1.1 认识信号:1.2 信号的产生:1.3 信号的异步:1.4 信号的处理: 2. 前后台进程3. 系统接口3.1 signal:3.1 - 1 不能被捕捉的信号 3.2 kill:3.2 - 1 killall 3.3 ra…

15.live555mediaserver-rtp打包

live555工程代码路径 live555工程在我的gitee下(doc下有思维导图、drawio图): live555 https://gitee.com/lure_ai/live555/tree/master 章节目录链接 0.前言——章节目录链接与为何要写这个? https://blog.csdn.net/yhb1206/art…

每天一道动态规划——第一天

动态规划一定要去尝试!题目一: 1)题目描述 一共有N个位置,机器人从当前位置cur走到目标位置aim,有res步可以走,问一共有多少种方法。 题目示例: 1 2 3 4 5 6 N6|cur2|aim3|res3 结果&#xf…

suricata初体验+wireshark流量分析

目录 一、suricata介绍 1.下载安装 2.如何使用-攻击模拟 二、wireshark流量分析 1.wireshark过滤器使用 2.wireshark其他使用 一、suricata介绍 1.下载安装 通过官网下载suricata,根据官网步骤进行安装。 官网地址: https://documentation.wazuh.…

Python高光谱遥感数据处理与高光谱遥感机器学习方法应用

本文提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本文涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心,用通俗易懂的语言解释高光谱的基本概念和理论,旨在帮助学员深入理解科学原理。方法篇结合Python编程工具,专注…

二叉树的层序遍历及完全二叉树的判断

文章目录 1.二叉树层序遍历 2.完全二叉树的判断 文章内容 1.二叉树层序遍历 二叉树的层序遍历需要一个队列来帮助实现。 我们在队列中存储的是节点的地址,所以我们要对队列结构体的数据域重定义, 以上代码 从逻辑上来讲就是1入队,1出队&am…

【信创】未写完

信创比赛 模块A任务二:docker容器集群管理 模块C子任务一:数据库部署子任务二:数据库参数配置子任务三:数据库管理 模块A 任务二:docker容器集群管理 1.docker run 新建创建容器 2.docker loan 将文件导入镜像库里(将该文件变成镜…

DDR PHY

1.ddr phy架构 1.pub(phy unility block) 支持特性: (1)不支持SDRAM的DLL off mode (2)数据位宽是以8bit逐渐递增的(这样做的目的是因为可能支持16/32/64bit的总线位宽&#xff…

STM32F103 4G Cat.1模块EC200S使用

一、简介 EC200S-CN 是移远通信最近推出的 LTE Cat 1 无线通信模块,支持最大下行速率 10Mbps 和最大上行速率 5Mbps,具有超高的性价比;同时在封装上兼容移远通信多网络制式 LTE Standard EC2x(EC25、EC21、EC20 R2.0、EC20 R2.1&a…

QtCreator指定Windows Kits版本

先说下事件起因:之前一直在用Qt5.12.6+vs2017在写程序,后面调研了一个开源库Qaterial,但是翻来覆去的编译都有问题,后面升级到了Qt5.15.2+vs2019来进行cmake的编译,搞定了Qaterial,但…

家长如何将ChatGPT成为家庭日常活动的得力助手

人工智能已经在许多领域发挥作用,如播放音乐、关闭灯光和帮助我们更安全地驾驶。那么,在养育孩子方面呢? 使用像ChatGPT这样的应用,家长们可以更好地完成任务,但同时也要了解其中存在的风险。 许多家长表示&#xff…

KVM创建虚拟机可访问外网+可使用Xshell等工具连接

创建虚拟机时使用桥接网络模块即可,如下: 1、创建一个存储卷(虚拟机的磁盘) 2、创建虚拟机时选择网络 3、系统安装完成后配置固定IP地址 vi /etc/sysconfig/network-scripts/ifcfg-eth0ONBOOTyes BOOTPROTOstatic IPADDR16.32.15.60 GATEWAY16.32.15.2…

【JasperReport笔记05】JasperReport指定自定义字体文件,解决中文不显示问题

这篇文章,主要介绍JasperReport指定自定义字体文件,解决中文不显示问题。 目录 一、自定义字体文件 1.1、创建字体配置文件 1.2、创建fonts.xml字体文件 1.3、在Jasper Studio中添加字体 1.4、指定模板文件 1.5、案例代码 1.6、运行测试 1.7、服…