一、变量的作用域
C语言根据变量的作用域不同,将变量分为局部变量和全局变量。
1.局部变量
1)定义:在函数内部定义的函数,称为局部变量。形参也属于局部变量。
2)作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。
2.全局变量
1)定义:在所有函数外部定义的变量,称为全局变量。
2)作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以再其定义位置之后共享。
二、变量的存储类型
变量存储类型就是指变量存储在什么地方。
有三个地方可以存储变量:普通内存、运行时堆栈、硬件寄存器。
变量的存储类型决定了变量何时创建、何时销毁,也就是变量的声明周期。
C语言根据变量的存储类型分为:自动变量、静态变量、寄存器变量。
1.自动变量
void test(int a,int b){ int c =a+b; auto int d; }
1)定义:自动变量是存储在堆栈中的。
2)哪些是自动变量:auto关键字修饰的局部变量,但是基本上是废的,因为所有的局部变量在默认情况下都是自动变量。
3)生命周期:
在程序执行到声明自动变量的代码块(函数)时,自动变量才会被创建,当自动变量所在的代码块(函数)执行完毕后,这些变量就会自动销毁。如果这一个函数重复调用,这些自动变量每次都会重新创建。
2.静态变量
#include <stdio.h> #include "one.h" #include "two.h" int a ;//静态变量 void test2(){ static int b=0;//静态变量 b++ ; } int main(){ test2(); printf("%d\n",b); return 0; }
1)定义:静态变量是存储在静态内存中的,也就是不属于堆栈。
2)哪些是静态变量
所有的全局变量都是静态变量
被static 关键字修饰的局部变量也是
3)生命周期
静态变量是在程序运行之前被创建的,在程序的整个运行期间始终存在,直到程序结束。
4)生命周期和作用域的理解
上面个的变量a,在代码执行到该行时,创建一个静态变量,存储在静态内存中。
作用域:在该行代码之后。生命周期:整个程序运行期间。
变量b是在函数内部定义的,在第一次调用函数的时候被创建,存储在静态内存中,第二次调用函数时,该行不被执行。作用域:函数内部。生命周期:整个程序运行期间。
3.寄存器变量
1)定义:存储在一个硬件寄存器中的变量,称为“寄存器变量”。寄存器变比存储在内存中的变量访问效率更高。默认情况下:自动变量和静态变量都是存储在内存中的,只是静态变量是存储在静态内存中的。
2)哪些变量是寄存器变量
register关键字修饰的自动变量。
只有自动变量才可能是寄存器变量。
寄存器变量只限于int、char、指针。
3)生命周期
因为寄存器变量本身就是自动变量,所以函数中的寄存器变量-在调用函数时占用寄存器中存放的值,当函数结束时释放寄存器,变量消失。
4)使用注意
由于计算机中寄存器数目有限,不能使用太多的寄存器标量。如果寄存器使用饱和时,程序将寄存器变量将自动转化为自动变量处理。
总结:
按作用域分:全局变量和局部变量
全局变量:在函数外声明的变量
局部变量:函数内部和函数形参
按存储位置分:自动变量、静态变量、寄存器变量
自动变量:所有的局部变量
静态变量:全局变量和static修饰的局部变量
寄存器变量:register修饰的局部变量。