局部变量和全局变量
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void func1(int temp);
int p = 1,q = 5; //这是全局变量 在函数外边定义的变量
//全局变量 可以为本文件中其他函数所共用
//范围:
//从定义变量的位置开会到本源程序文件结束
//如果整个文件开头定义了该变量 则整个文件范围内都可以使用该变量
//在一个函数中 既可以使用本函数中的局部变量 又可以使用 -有效- 的全局变量
//全局变量的优缺点:
//优点:增加了函数与函数之间的数据联系的渠道 如果一个函数中改变了全局变量的值 就能影响到其他函数\
//相当于在各个函数之间有个直接的传递通道 不再需要通过实参和形参来传递数值了
//缺点:只有在必要的时候才使用全局变量(所以谨慎使用) 因为全局变量在程序运行整个周期之间占用内存 而不像函数内的局部变量
//函数内局部变量的特点是 当函数变量所占内存会被系统回收
//降低了函数的通用性 函数执行时 要依赖这些全局变量了 如果函数迁移到另外一个文件中 那这些相关的外部变量就得一起迁移过去
//东一个全局变量 西一个全局变量 降低了程序的清晰性和可读性 读程序的人难以清除的判断每个瞬间各个外部变量的值(因为很多函数都可以改变这个外部变量的值)
//所以我们要限制全局变量的使用
int f1(int a){
//不能使用c1 c2 但是可以用p q
p = 800;
int b,c;
return 1;
}
//外部变量说明,表示某一个地方定义了c1 c2这两个全局量
extern char c1,c2;//定义时分配内存
void lookvalue(){
c1 = 1;//给全局变量赋值
c2 = 8;
return;
}
char c1,c2;//全局变量
char f2(int x,int y){
//p q c1 c2都可以用
int i,j;
return 0;
}
int main(int argc, char *argv[]) {
//局部变量和全局变量
//局部变量:在一个函数的内部定义一个变量叫局部变量 他只是在本函数内有效 也就是说 只是在本函数内才能使用
//在本函数外面就不可以使用本函数
int m,n;
int k = 4;//这都是局部变量
//主函数(main)中定义的变量中 m,n,k只在主函数中有效
//虽然主函数调用了其他函数 但是在其他函数中 依旧无法使用主函数中定义的变量
func1(k);
//不同的函数可以使用相同的变量名,互不干扰。
//形参temp(在下面)也是局部变量 他也只在func()有效 在其他函数里不能调用
//有一些特殊写法:能读懂就行
int x,y;
//...、
//一段代码段 复合语句中定义变量 这些变量仅仅在此复合语句中有效 这种复合语句也叫程序块
{
int c; //只能在复合语句内有用
c = x+y;
}
//c = 2; 在大括号外就不可以用 一旦离开复合语句 变量c的内存就被释放掉了
//全局变量:在函数外定义的变量,我们称之为全局变量(外部变量)
f1(32);
printf("p:%d\n",p);
//如果某个函数想引用在他后面的全局变量,则可以用一个关键字叫extern做一个外部变量说明
//表示该变量在函数的外部定义 这样的函数内能够使用 否则编译就会出错
//全局变量的定义放在它引用函数的之前 就可以避免使用这个extern
//严格区分外部变量定义和外部变量说明:
lookvalue();
printf("c1:%d\n",c1);
//在同一个源文件中,如果全局变量和局部变量同名,则在局部变量作用范围内,全局变量不起作用(当然值也不受到影响)
{
int c1,c2;
c1 = 100;
c2 = 200;
printf("c1 = %d,c2 = %d\n",c1,c2);//局部变量里的c1 c2
}
printf("c1 = %d,c2 = %d\n",c1,c2);//全局变量里的c1 c2
}
void func1(int temp){
//这里无法使用main()中的定义的m,n,k;
int x,y;//局部变量
//这里能使用的变量是tem,x,y 都可以使用
//不同的函数可以使用相同的变量名,互不干扰。
int m,n; //和main中的m,n完全不同,占用的内存地址也完全不同。
return;
}