20170418
变量 的两个重要特征:生命周期和作用域
决定什么时候以及在什么地方可以使用某个变量。
作用域:
1. 全局变量
声明在所有函数之外的变量叫全局变量。全局变量的作用域是由程序中的所有语句构成的。没有初始化的全局变量自动被初始化成0.
2. 局部变量
声明在函数内部的变量叫局部变量,局部变量的作用域包含函数内部的所有语句。
3.块变量
块变量的作用域包含语句块内部的所有语句
生命周期:
全局变量,局部变量和块变量的声明周期也不一样
全局变量的存储位置在程序开始时被分配,在程序结束时被回收。全局变量的生命周期包含整个程序运行期间。
局部变量的存储位置在函数开始运行时被分配,在函数结束时回收,局部变量的生命周期包括整个函数运行期间。
形式参数的生命周期和局部变量一样。
块变量的存储位置在语句块开始运行时被分配,在语句块结束时被回收,它的生命周期包括整个语句块运行期间。
声明变量时可以使用关键字
1.auto关键字用来声明自动变量。
所有局部变量缺省都是自动变量,几乎不需要使用这个关键字。
2.static关键字用来声明静态变量,静态变量的生命周期和作用域是和不同东西相关的,它们不一致
静态全局变量:静态全局变量的作用域包括声明它的那个文件中的所有语句。
静态局部变量和静态块变量:生命周期被拉长,它们的生命周期包括整个程序运行期间。
没有初始化的静态局部变量自动被初始化成0。
静态局部变量和静态块变量的初始化只在程序开始时执行一次
3.const关键字用来声明不可赋值的变量
这种变量应该在初始化的时候赋值
1 #include <stdio.h>
2 int main() {
3 const int num = 12;
4 printf("请输入一个数字:");
5 scanf("%d", &num);
6 printf("num是%d\n", num);
7 return 0;
8 }
用这样的方法,改变了const中的内容,这种变量的内容可以通过其他方式修改
4.volatile关键字用来声明多变的变量。
这种变量的内容随时可能被改变,而且这种改变的原因不是我们的语句构成的。
练习:
1.编写递归函数打印数组中的所有数字。
1 #include <stdio.h>
2
3 void print(int arr[], int size,int curr) {
4 if(curr == size - 1) {
5 printf("%d\n", arr[curr]);
6 return ;
7 }
8 printf("%d ", arr[curr]);
9 print(arr, size, curr + 1);
10 }
11
12 int main() {
13 int arr[] = {1, 7, 3, 45, 2, 8, 9};
14 print(arr, 7, 0);
15 return 0;
16 }