一、局部变量
在一个
函数
内部
定义的变量叫做
局部变量,它只在
本函数范围内有效。也就是说,只有在本函数内才能使用它们,在本函 数外是不能使用这些变量的。
#include
//函数声明
void func1(int tmpvalue);
int main()
{
int m,n; //局部变量,但是只在main()函数内有效
int k=4; //局部变量,但是只在main()函数内有效
return 0;
//1、主函数main()中定义的变量m,n,k只在主函数中有效,虽然主函数调用了其他函数,但是在其他函数中依旧无法使用主函数中定义的变量
//2、不同的函数可以使用相同的变量名,互不干扰。
//3、形式参数,也是局部变量,比如func1中的tmpvalue,只在func1函数中有效。
//4、有一种特殊写法,用一个大括号写一段代码,大括号括起来的这个叫复合语句,在该复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也叫程序块。
int a,b; //这里的有效范围直到函数末尾
//....
{
int c; //c的有效范围只在这个复合语句内,一旦离开复合语句,变量的内存就被系统释放掉了。
c=a+b;
}
}
//函数定义
void func1(int tmpvalue)
{
//这里无法使用main()函数中定义的m,n,k
int x,y; //局部变量,但是只在func1()函数内有效
int m,n; //这里的和main()中的m,n完全不同,占用的内存地址也完全不同。
}
一个项目可以由一个或者多个源程序文件(project1.cpp)组成。
二、全局变量
在
函数
外
定义的变量称为
全局变量(外部变量)。
可以为本文件中其他函数共用。
全局变量的有效范围:
从定义变量的位置开始到
本源程序文件结束。
如果你在整个文件开头定义了该变量,则整个文件范围内都可以使用该全局变量。
总结:在一个函数中,既可以使用本函数中的局部变量,又可以使用有效的全局变量。
void func1(int tmpvalue);
全局变量的优缺点:
优点:增加了函数与函数之间的数据联系渠道,如果一个函数中改变了全局变量的值,就能影响到其他函数,相当于在各个函数之间有了直接的传递通道,不再需要通过实参和形参来传递参数值了。
缺点:
a.只有在必要的时候才使用全局变量(要谨慎使用),因为全局变量在程序运行整个周期之间都占用内存,而不像函数内的局部变量(当函数执行完毕后,局部变量所占的内存会被系统回收)。
b.降低了函数的通用性,因为函数执行时要以来这些外部的全局变量了,如果将函数迁移到另外一个文件中,那这些相关的外部变量就一起跟着移植过去,并且如果你迁移到另外一个文件中也有同名全局变量,那就更加麻烦。
c.东一个全局变量,西一个全局变量,降低了程序的清晰性和可读性,读程序的人难以清楚的判断每个瞬间各个外部变量的值。(因为很多函数都可以改变全局变量的值),所以,要限制使用全局变量。
void func1(int tmpvalue);
总结:
(1)、如果某个函数想 引用在他后面定义的全局变量,则可以用一个关键字叫
extern 做一个“
外部变量说明”,表示该变量在函数的外部定义,这样函数内就能使用,否则编译就会出错。
所以,结论是全局变量(外部变量)的定义就放在引用他的所有函数之前,就可以避免使用这个extern。
(2)、要严格区分
外部变量与一个
外部变量说明:
外部变量的定义
只能有一次,位置是所有函数之外,定义时
会分配内存,定义时
可以初始化值;
而同一个文件中,外部变量说明是
可以有很多次的(外部变量说明
不分配内存),外部变量声明
放在最上面,所有函数之外。也可以在每个函数之内做外部变量说明(但是这个声明了的变量仅仅在函数内有效),因此进一步加深了对外部变量说明的理解:所声明的变量是已在外部定义过的变量,extern这个声明,仅仅是为了引用该变量而做的“声明”。
void func1(int tmpvalue);
(3)、在同一个源文件中,如果全局变量和局部变量
同名,则
在局部变量作用范围内,
全局变量
不起作用(当然值也不会受到 影响)。
printf("函数外的c1=%d\n",c1);
printf("函数外的c2=%d\n",c2);
printf("函数内的c1=%d\n",c1);
printf("函数内的c2=%d\n",c2);
void lookvalue(int a,int b)