34 变量作用域
1,所谓作用域,就是指变量的有效范围
2,函数内部声明 / 定义的局部变量,作用域仅限于函数内部
3,函数的参数,形式参数,被当做该函数内部的局部变量,如果与全局变量同名,会优先使用局部变量(编译器使用就近原则)
打印结果:
n=9
4,在一个代码块,比如 for / if 中的局部变量,那么这个变量的作用域就在该代码块
5,在所有函数外部定义的变量叫全局变量,作用域在整个程序有效
6,初始化局部变量和全局变量
①局部变量:系统不会对其默认初始化,必须对局部变量初始化后才能使用功能,否则,程序运行后可能会异常退出
②全局变量:系统会自动对其初始化,
③正确的初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。
7,全局变量保存在内存的全局存储区中,占用静态的存储单元,它的作用域默认是整个程序,也就是所有的代码文件,包括源文件(.c文件)和头文件(.h文件)
C程序布局图:
8,①局部变量保存在栈中,函数被调用时才动态的为变量分配存储单元,它的作用域仅限于函数内部
②C语言规定,只能从小的作用域向大的作用域去寻找变量,而不能反过来,使用更小的作用域中的变量
③在同一个作用域,变量名不能重复,在不同的作用域,变量名可以重复,使用时编译器采用就近原则。
④由{ } 包围的代码块也拥有独立的作用域
9,练习1,分析代码输出:
f1 中的 price 就是全局变量,f2中的price没有定义,因而也是全局变量,并且把全局变量的值改为 250.0,main中的price是全局变量。
执行f1时,打印 f1 的 price 即 200.0
执行f2时,打印 f2 的price 即 250.0
再执行f1 时,全局price 已被修改为 250.0,因此打印出的price 变为 250.0
如果将 f2中的 price=250.0 改为 double price =250.0; 则 f2 中的 price 就是 f2 的局部变量,与全局price 无关,就不会改变全局 price 的值,main中第二次调用 f1 时,打印的就仍然是 200.0
10,练习2:
1 #include<stdio.h> 2 3 4 int n = 10; 5 void fun1() { 6 int n = 20; //局部变量 7 printf("fun1 n=%d\n", n); 8 } 9 void fun2(int n) { 10 printf("fun2 n=%d\n", n); //n是形参n 11 } 12 void fun3() { 13 printf("fun3 n=%d\n", n); //全局变量 14 } 15 void main() { 16 int n = 30; //局部变量 17 fun1(); 18 fun2(n); 19 fun3(); 20 21 { 22 int n = 40; //局部变量 23 printf("block n=%d\n", n); 24 } 25 26 printf("main n=%d\n", n); 27 }