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.hqwc.cn/news/255974.html

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

相关文章

[数据集][目标检测]拉横幅识别横幅检测数据集VOC+yolo格式1962张1类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1962 标注数量(xml文件个数)&#xff1a;1962 标注数量(txt文件个数)&#xff1a;1962 标注类别数&a…

网络机房的功能有哪些?

网络机房的功能主要包括&#xff1a; 信息存储和管理&#xff1a;机房作为信息系统的核心&#xff0c;需要提供可靠的存储和管理能力&#xff0c;包括服务器、存储设备、备份系统等硬件设备&#xff0c;以及数据备份、数据迁移、容灾等管理方法和技术。网络连接和通信&#xf…

C语言指针详解上

1 野指针 int main01(){//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针//int a 0;//指针p保存的地址一定是定义过的(向系统申请过的)int *p;//野指针*p 200;printf("%d\n",*p);system("pause");return 0;}2 空指针 空指针的作用…

ubuntu18.04 vscode 安装 vue.volar Vue Language Features (Volar) , vue3 必备插件

直接在vscode 里面下载老是失败&#xff0c;不是网络问题&#xff0c;而是vue.volar插件配置的vscode版本与vscode版本不一致导致出现安装失败 官网下载最新的 vue.volar插件 https://marketplace.visualstudio.com/ 官网搜索 vue.volar 然后打开 Vue Language Features (Vol…

Uber Go 语言编码规范

uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司&#xff0c;也是 Go 语言的早期 adopter。其开源了很多 golang 项目&#xff0c;诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…

数据结构 | 查漏补缺之求叶子结点,分离链接法、最小生成树、DFS、BFS

求叶子结点的个数 参考博文&#xff1a; 树中的叶子结点的个数 计算方法_求树的叶子节点个数-CSDN博客 分离链接法 参考博文 数据结构和算法——哈希查找冲突处理方法&#xff08;开放地址法-线性探测、平方探测、双散列探测、再散列&#xff0c;分离链接法&#xff09;_线性…

Mysql综合案例练习<1>

MySql综合案例练习<1> 题目一题目二题目三题目四题目五题目六题目七题目八题目九题目十题目十一题目十二题目十三题目十四题目十五题目十六题目十七题目十八题目十九 题目一 创建数据库test01_library 创建表 books&#xff0c;表结构如下&#xff1a; CREATE DATABASE …

微信机器人接口开发

简要描述&#xff1a; 设置http回调地址 请求URL&#xff1a; http://域名地址/setHttpCallbackUrl POST 请求头Headers:&#xff08;别忘了传&#xff09; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必…

家政预约小程序带商城,图文详解

家政预约小程序开发&#xff0c;在线选择服务分类&#xff0c;选择上门时间&#xff0c;提交订单&#xff0c;在线支付。 商城模块&#xff1a;商品分类&#xff0c;在线下单支付。 个人中心&#xff1a;订单管理&#xff08;家政订单&#xff0c;搬家订单&#xff0c;商品订…

hive sql子单元查找组合单元信息

1. 背景 店铺卖东西&#xff0c;会将一部分子商品&#xff08;单个商品&#xff0c;sku 粒度&#xff09;打包到一起&#xff0c;变成一个组合商品去售卖。 用户买东西&#xff0c;可能会买多个组合商品。 数仓这边拿到的数据&#xff0c;全是已经拆分到子商品的订单商品数据…

排序:直接选择排序

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

地震反演基础知识3

文章目录 地震勘探原理1 地震波1. 1 地震波概念1. 2 波的传播1. 2. 1 波传播的基本原理1. 2. 2 地震波的反射,折射,透射的1. 2. 3 地震子波&#xff08;seismic wavelet&#xff09;1. 2. 4 地震合成记录 2 地震时距曲线2.1 地震时距曲线作用2.2 不同波的时距曲线2.2.1 直达波时…