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);  
 8 }
 9 void fun2(int n) {
10     printf("fun2 n=%d
", n);  //n是形参n
11 }
12 void fun3() {
13     printf("fun3 n=%d
", 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);
24     }
25 
26     printf("main n=%d
", n);
27 }

原文地址:https://www.cnblogs.com/shanlu0000/p/12349784.html