局部变量和全局变量
1.局部变量
局部变量是在函数内作定义说明的,其作用域仅限于函数内,离开该函数后再使用这种变量则为非法的。
int f1(int a)
{
int b,c;
......
}
局部变量的作用域注意点
(1).主函数是一个函数,它与其它函数是平行关系,所以在主函数中定义的变量只能在主函数中使用,不能在其它函数中使用也不能使拥其它函数中定义的变量。
(2).形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
(3).在不同的函数中使用相同变量名是可以的。
(4).在复合语句中也可定义变量,其作用域只在复合语句范围内。
int main()
{
int i =2,j=3,k;
k=i+j;
{
int k=8;
printf("%d\n",k);
}
printf("%d\n",k);
}
全局变量
在函数内定义的变量是局部变量,而在函数外定义的变量叫做外部变量,外部变量也属于全部变量。全局变量可以为本文件中其他函数所共用它的有效范围从定义变量的位置开始到本源文件结束。 建立全局变量的作用是增加了函数间数据联系的渠道。
int a,b; /*外部变量*/
void f1()
{
.....
}
foat x,y; /*外部变量*/
int fz() /*函数fz*/
....
}
int main() /*主函数*/
{
....
}
在上列中,x,y定义咋函数f1之后,而在f1内又无对x,y的说明,所以
用extern声明:
如果外部变量不在文件的开头定义,其有效的作用范围只能从定义点到文件结束。如果在定义点之前的函数想引用该外部变量,则应该在应用之前用关键字extern对该变量作‘外部变量声明’。表示该变量是一个已经定义了的外部变量。有了此声明,就可以从声明处起,合法的调用该外部变量。
用static声明:
有时在程序中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时就可以在定义外部变量时在其前面加一个static声明。此时的外部变量也成为静态全局变量。
const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。如果真的想改变 const所定义的 全局变量的值 也是有办法的,可以通过指针,如下程序:
const关键字的作用主要有以下几点:
(1)可以定义const常量,具有不可变性。 例如:
const int Max=100; int Array[Max];
(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改;
(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。
(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错; 例如:
void f(const int i) { i=10;//error! }
(5) 为函数重载提供了一个参考。
class A { ......
void f(int i) {......} //一个函数
void f(int i) const {......} //上一个函数的重载 ......
};
(6) 可以节省空间,避免不必要的内存分配。 例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以, const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
(7) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
#include <stdio.h>
int main()
{
const int a = 1;
int *p = (int *)&a;
*p = 2;
printf("a = %d\n", a);
return 0;
}
此时 相当于通过指针 *p在外部 连接a的地址 从而通过在外部改变值 来影响 a的取值;
这种情况 极少出现。