免费建购物网站,著名的wordpress网站,wordpress 添加广告,聚美优品的网站建设状况1.10 C语言之外部变量与作用域 一、外部变量概述二、练习 一、外部变量概述
我们说#xff0c;函数#xff08;不管是main函数还是其他函数#xff09;内部定义的变量#xff0c;其作用范围都只在函数内部#xff0c;我们把这些变量叫做自动变量或者局部变量。除了局部变… 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语言
二、练习
编写程序detab将输入中的制表符替换成适当数目的空格使空格充满到下一个制表符终止位的地方。假设制表符终止位的位置是固定的比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢编写程序entab将空格串替换为最少数量的制表符和空格但要保持单词之间的间隔不变。假设制表符终止位的位置与练习1的情况相同当使用一个制表符或者一个空格都可以到达下一个制表符终止位时选用哪一种替换字符比较好编写一个程序把较长的输入行折成短一些的两行或多行折行的位置在输入行的第n列之前的最后一个非空格之后。要保证程序能够智能的处理输入行很长以及在指定的列前没有空格或制表符时的情况。编写一个删除c语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量在c语言中注释不允许嵌套。编写一个程序查找c 语言程序中的基本语法错误如圆括号、方括号、花括号不配对等。要正确处理引号包括单引号和双引号、转义字符序列与注释。