1.10 C语言之外部变量与作用域

1.10 C语言之外部变量与作用域

  • 一、外部变量概述
  • 二、练习

一、外部变量概述

  • 我们说,函数(不管是main函数还是其他函数)内部定义的变量,其作用范围都只在函数内部,我们把这些变量叫做自动变量或者局部变量。
  • 除了局部变量外,还可以定义位于所有函数外部的变量,也就是说,在所有函数中都可以通过变量名访问这种类型的变量。由于外部变量可以在全局范围内访问,因此,函数间可以通过外部变量交换数据,而不必使用参数表。再者,外部变量在程序执行期间一直存在,而不是像局部变量一样在函数调用完成之后消失,即使在对外部变量赋值的函数返回后,这些变量仍将保持原来的值不变。
  • 外部变量必须定义在所有函数之外,并且只能定义一次,定义后编译程序将为它分配存储单元。
  • 在每个需要访问外部变量的函数中,必须声明相应的外部变量,并说明它的类型。声明时可以通过extern语句显式声明,也可以通过上下文隐式声明。

我们先改写之前的打印最长文本行的程序,把line、longest、max声明为外部变量,再做详细描述

#include <stdio.h>
#define MAXLINE 1000 //最大行长度限制
char longest[MAXLINE];
char line[MAXLINE];
int max;
int getline(void); // 读取一行
void copy(void); // 数组拷贝// 打印所有输入行中长度最长的行
main()
{int len; // 当前行长度extern int max; // 最大长度extern char longest[MAXLINE]; // 保存最长的行max = 0;while ((len = getline()) > 0) {if (len > max) {max = len;copy();}}if (max > 0)printf("%s", longest);return 0;
}// 读取一行数据到数组s中,并返回该行的长度
int getline(void) {int c, i;extern char line[MAXLINE]; // 保存当前输入行for (i = 0; i < MAXLINE - 1 && (c = getchar()) != EOF && c != '\n'; ++i)line[i] = c;if (c == '\n') {line[i] = c;++i;}line[i] = '\0';return i;
}// 返回值类型为void,显式说明该函数不返回任何值
void copy(void) {int i;extern char line[MAXLINE], longest[MAXLINE];i = 0;while ((longest[i] = line[i]) != '\0')++i;
}
  • 上面的程序,在最前面的几行中定义了外部变量,line、longest、max,并声明了变量的类型,这样编译器会为他们分配存储单元。从语法角度看,外部变量的定义和局部变量的定义是相同的,但由于它们位于各函数的外部,因此这些变量是外部变量。

  • 如果要在函数中使用外部变量,一种显式声明的方式是external 外部变量名

  • 某些情况下可以省略extern声明:在源文件中,如果外部变量的定义出现在使用它的函数之前,那么在那个函数中就没有必要使用extern声明。因此main,getline,copy函数中的几个extern声明是多余的(这里存疑,经验证:数组类型的变量去掉extern会出错)。在通常的做法中,所有的外部变量都放在源文件的开始处,这样就可以省略extern的声明。

  • 如果程序包含在多个源文件中,而某个变量在file1文件中定义,在file2和file3文件中使用,那么在file2和file3中就需要使用extern声明来建立该变量与其定义之间的联系。人们通常把变量和函数的声明放在一个单独的文件中(习惯上称之为头文件),并在每个源文件中使用#include语句把所要用到的头文件包含进来。后缀名为.h约定为头文件名的扩展名。比如标准库中的函数就是在类似于<stdio.h>的头文件中声明的。
    如果使用vs调试,#include找不到自定义的头文件,可以点击项目->属性->VC++目录->包含目录,把自己的头文件所在路径加进去试试
    在这里插入图片描述

  • 在ANSI C中,如果函数的参数为空,则必须使用void显式声明,以区分老版本C语言

二、练习

  1. 编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?
  2. 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止位的位置与练习1的情况相同,当使用一个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪一种替换字符比较好?
  3. 编写一个程序,把较长的输入行折成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后。要保证程序能够智能的处理输入行很长以及在指定的列前没有空格或制表符时的情况。
  4. 编写一个删除c语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量,在c语言中,注释不允许嵌套。
  5. 编写一个程序,查找c 语言程序中的基本语法错误,如圆括号、方括号、花括号不配对等。要正确处理引号(包括单引号和双引号)、转义字符序列与注释。

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

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

相关文章

嵌入式工程师校招经验与学习路线总结

前言&#xff1a;不知不觉2023年秋招已经结束&#xff0c;作者本人侥幸于秋招中斩获数十份大差不差的OFFER&#xff0c;包含&#xff1a;Top级的AIGC&#xff0c;工控龙头&#xff0c;国产MCU原厂&#xff0c;医疗器械&#xff0c;新能源车企等。总而言之&#xff0c;秋招总体情…

HarmonyOS开发工具DevEco Studio的下载和安装

一、DevEco Studio概述 一、下载安装鸿蒙应用开发工具DevEco Studio 开发鸿蒙应用可以从鸿蒙系统上运行第一个程序Hello World开始。 为了得到这个Hello World&#xff0c;你需要得到这个Hello World的源代码&#xff0c;源代码是用人比较容易看得懂的计算机编程语言规范写的…

leetcode做题笔记1466. 重新规划路线

n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变交通拥堵的状况。 路…

排序:直接选择排序

直接选择排序&#xff1a; 本质&#xff1a; 直接选择排序的本质就是在数组中进行遍历挑选出最大的元素&#xff0c;讲最大的元素放到对应的位置后&#xff0c;再次选出次大的位置&#xff0c;而后又放到对应的位置..........................直到数组成为一个有序序列。 优…

Leetcode刷题笔记题解(C++):LCR 121. 寻找目标值 - 二维数组

思路&#xff1a;从左小角或者右上角开始遍历&#xff0c;假设右上角开始遍历&#xff0c;如果当前值大于目标值则列-1&#xff1b;如果当前值小于目标值则行1&#xff0c;以此遍历来查找目标值&#xff1b;注意col和row的选取 class Solution { public:bool findTargetIn2DPl…

异常检测 | 基于孤立森林(Isolation Forest)的数据异常数据检测(结合t-SNE降维可视化)

异常检测 | MATLAB实现基于孤立森林的数据异常检测 目录 异常检测 | MATLAB实现基于孤立森林的数据异常检测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于孤立森林(Isolation Forest)的数据异常数据检测可视化&#xff08;完整源码和数据) 基于孤立森林(…

状态机的练习:按键控制led灯

设计思路&#xff1a; 三个按键控制led输出。 三个按键经过滤波(消抖)&#xff0c;产生三个按键标志信号。 三个led数据的产生模块&#xff08;流水&#xff0c;跑马&#xff0c;闪烁模块&#xff09;&#xff0c;分别产生led信号。 这六路信号&#xff08;三路按键信号&am…

SpringBoot 注入RedisTemplat 启动报错

需求 因为需要限制部门内多个人员同一时间操作同一批客户的需求&#xff0c;考虑下决定用Redis滑动窗口实现自过期以及并发校验。 问题 新建了个Redis工具类封装RedisTemplat 操作&#xff0c;到启动时却发现无法正常启动&#xff0c;报错注入错误。 The injection point has…

SpringBoot集成系列--ElasticJob

文章目录 一、集成步骤1、添加 ElasticJob 的依赖2、配置 ElasticJob3、定义Job 二、ElasticJob-UI三、Elastic-Job分片理解四、原理 一、集成步骤 1、添加 ElasticJob 的依赖 引入相关依赖到pom.xml <!-- Elastic-Job --> <dependency><groupId>org.apac…

Liunx Centos 防火墙操作

liunx centos 防火墙 查看防火墙状态 systemctl status firewalld查看已经开放的端口 firewall-cmd --list-ports添加端口3306 firewall-cmd --zonepublic --add-port3306/tcp --permanent重启防火墙 firewall-cmd --reload数据库开放账号可以外网登陆 mysql -u root -p …

JavaSE语法之五:数组的定义与使用(超详解!!!)

文章目录 一、数组的概念1. 什么是数组2. 数组的创建及初始化3. 数组的使用3.1 数组中元素的访问3.2 遍历数组 二、数组是引用类型1. 初始JVM的内存分布2. 基本类型变量与引用变量的区别3. 引用变量4. 认识null 三、数组的应用场景1. 保存数据2. 作为函数的参数2.1 参数传基本类…

Cheat Engine修改器检测方案

在游戏安全对抗过程中&#xff0c;有不少外挂的实现基于对游戏内存模块进行修改&#xff0c;这类外挂通常会使用「内存修改器」。 据FairGuard游戏安全数据统计&#xff0c;在游戏面临的众多安全风险中&#xff0c;修改器的占比高达16% 。如此高的占比&#xff0c;修改器的危害…

血糖仪_智能便携式血糖检测仪定制_基于联发科MTK8788血糖仪方案

糖尿病早期通常没有明显的症状&#xff0c;因此很难自己意识到自己已经进入高血糖状态。而且&#xff0c;到医院进行检查需要挂号、门诊和排队等步骤&#xff0c;不仅费时费力&#xff0c;对于父母来说&#xff0c;频繁去医院检查是不现实的&#xff0c;也不舍得这样做。因此&a…

maven-assembly-plugin 自定义打包

我想把input文件夹给打包进去 pom文件 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><executions><execution><!-- 配置执行器 --><i…

vue2 百度地图实现 车在线路上移动 BMap、BMapGL

文章目录 效果BMap 实现vue2 中BMap实现vue2 中使用BMapGL实现 参考文章&#xff1a; 百度地图API实时画出动态运行轨迹&#xff08;一条行驶轨迹&#xff09;&#xff0c;车头实时指向行驶方向&#xff0c;设置角度偏移 下文中可能用到的图片统一放在上面&#xff0c;自取。 …

Halcon threshold_sub_pix (Operator)

read_image(Image,fabrik) threshold_sub_pix(Image,Border,35) dev_display(Border)Image是输入的原始图像&#xff0c;Threshold是设定的阈值&#xff0c;Width和Height是像素值计算区域的大小&#xff0c;ThresholdedRegion是经过分割后得到的二值化结果。 在对图像进行二值…

深眸科技以机器视觉高性能优势,为消费电子行业提供优质解决方案

机器视觉技术近年来发展迅速&#xff0c;基于计算机对图像的处理与分析&#xff0c;能够识别和辨别目标物体&#xff0c;被广泛应用于人工智能、智能制造等领域。 机器视觉凭借着高精度、高效率、灵活性和可靠性等优势&#xff0c;不断推进工业企业生产自动化和智能化进程&…

Anaconda安装教程及多次安装失败原因

Anaconda下载网址 本教程包含两部分&#xff1a;安装教程和多次安装Anaconda导致的失败原因分析 Anaconda安装包官网下载链接 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b5be0deb0aef4a81a594df79ddc1cc96.png#pic_center 安装 按以下步骤安装 红色波浪…

UEC++ 探索虚幻5笔记 day11

虚幻5.2.1探索 项目目录探索 C工程一定不能是中文路径&#xff0c;中文项目名&#xff0c;最好全部不要用中文&#xff0c;蓝图项目可以是中文浅浅创建一个空项目&#xff0c;讲解一下之前UE4没有讲解的项目目录文件的分布组成 .vs&#xff1a;文件夹一般是项目编译缓存文件夹…

一维相位解包裹

一维相位解包裹 本文首先介绍最简单的一维的位相解包裹算法。设W是包裹运算符&#xff0c;中是解包裹位相&#xff0c;是包裹的位相。则一维位相解包裹可表示为&#xff1a; 解包裹就是要选取正确的k,满足&#xff1a; 两个相邻像素位相的差值如下&#xff1a; 由式(2-1)和式(2…