- 局部变量和全局变量
定义变量可能有三种情况:
- 在函数的开头定义
- 在函数内的复合语句内定义
- 在函数的外部定义
- 局部变量
- 在一个函数内部定义的变量只在本函数范围内有效
- 在复合语句内定义的变量只在本复合语句范围内有效
- 在函数内部或复合语句内部定义的变量称为“局部变量”
- 全局变量
- 在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,也称全局变量
- 全局变量可以为本文件中其他函数所共用
- 有效范围为从定义变量的位置开始到本源文件结束
- 可以通过extern关键字扩展到其它文件使用
- 定义三个整型全局变量int a,b,m;
- 写个求最大值的函数max,运算数为全局变量,运算结果存入全局变量m中
- 在主函数调用max函数
- 打印最大值,也就是全局变量m的值
#include //包含标准IO头文件
extern int a,b,m; //对全局变量声明,将其作用域扩展到此处
void max(void); //对函数max进行声明
int main() //主函数,程序的入口
{
scanf(“%d,%d\n”,&a,&b); //输入值存入全局变量a,b
max(); //调用函数max求出最大值
printf(“最大值是%d\n”,m); //打印最大值
return 0; //函数的返回值为0
}
int a,b,m; //定义int型全局变量a,b,m
void max(void) //定义max函数
{
m = a > b ? a :b;
} //求出最大值存入全局变量m中
- 动态存储方式与静态存储方式
- 从变量的作用域的角度来观察,变量可以分为全局变量和局部变量
- 从变量值存在的时间(即生存期)观察,变量的存储有两种不同的方式:静态存储方式和动态存储方式
- 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式
- 动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式
- 数据类型,如整型、浮点型等
- 存储类别指的是数据在内存中存储的方式(如静态存储和动态存储)
- 存储类别包括:
自动的、静态的、寄存器的、外部的
4. 根据变量的存储类别,可以知道变量的作用域和生存期
- 局部变量的存储类别
- 局部变量,如果不专门声明存储类别,都是动态地分配存储空间的
- 调用函数时,系统会给局部变量分配存储空间,调用结束时就自动释放空间。因此这类局部变量称为自动变量
- 自动变量用关键字auto作存储类别的声明
希望函数中的局部变量在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次再调用该函数时,该变量已有值(就是上一次函数调用结束时的值),这时就应该指定该局部变量为“静态局部变量”,用关键字static进行声明
例:输出1到5的阶乘值。
解题思路:可以编一个函数用来进行连乘,如第1次调用时进行1乘1,第2次调用时再乘以2,第3次调用时再乘以3,依此规律进行下去。
- 一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的
- 寄存器变量允许将局部变量的值放在CPU中的寄存器中
- 现在的计算机能够识别使用频繁的变量,从而自动地将这些变量放在寄存器中,而不需要程序设计者指定
- 全局变量的存储类别
- 全局变量都是存放在静态存储区中的。因此它们的生存期是固定的,存在于程序的整个运行过程
- 一般来说,外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。
- 外部变量有效的作用范围只限于定义处到本文件结束。
- 如果用关键字extern对某变量作“外部变量声明”,则可以从“声明”处起,合法地使用该外部变量
例: 调用函数,求3个整数中的大者。
解题思路:用extern声明外部变量,扩展外部变量在程序文件中的作用域。
#include
int main()
{
int max( );
extern int A,B,C;
scanf(“%d %d %d”,&A,&B,&C);
printf("max is %d\n",max());
return 0;
}
int A ,B ,C;
int max( )
{
int m;
m=A>B?A:B;
if (C>m) m=C;
return(m);
}
将外部变量的
- 如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量Num,不能分别在两个文件中各自定义一个外部变量Num
- 应在任一个文件中定义外部变量Num,而在另一文件中用extern对Num作“外部变量声明”
- 在编译和连接时,系统会由此知道Num有“外部链接”,可以从别处找到已定义的外部变量Num,并将在另一文件中定义的外部变量num的作用域扩展到本文件作用域扩展到其他文件
例: 给定b的值,输入a和m,求a*b和am的值。
解题思路:
- 分别编写两个文件模块,其中文件file1包含主函数,另一个文件file2包含求am的函数。
- 在file1文件中定义外部变量A,在file2中用extern声明外部变量A,把A的作用域扩展到file2文件。
文件file1.c:
#include
int A;
int main()
{
int power(int);
int b=3,c,d,m;
scanf("%d,%d",&A,&m);
c=A*b;
printf("%d*%d=%d\n",A,b,c);
d=power(m);
printf("%d**%d=%d\n",A,m,d);
return 0;
}
文件file2.c:
extern A;
int power(int n)
{
int i,y=1;
for(i=1;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?