本文主要内容:C语言中局部变量、全局变量和静态变量的生命周期。
一、局部变量
1.定义
局部变量,也称内部变量,是指在一个函数内部或复合语句内部定义的变量。局部变量的作用域是定义该变量的函数或定义该变量的复合语句。局部变量的生存期是从函数被调用的时刻算起到函数返回调用处的时刻结束。
[以上来自百度百科]
2.代码例子
- 我们来看一个例子:
在下面的代码中,有x、y、z、a、b、c、arr[]七个变量,它们都定义在函数内部,x、y、z定义在add(int,int)函数内部,其余都定义在main()函数内部。所以,它们都是局部变量。
int add(int x,int y){
x=2;
y=3;
int z=x+y;
return z;
}
int main(){
int a=1;
int b=1;
int c=add(a,b);
printf("%d + %d = %d",a,b,c);
int arr[5]={1,2,3,4,5};
print(arr[0]);
return 0;
}
3.代码执行过程解析
-
接下来,我们通过调试更加直观的去理解局部变量的生命周期
-
1、初始状态,未对变量进行赋值。a、b、c的值均为随机值,而main函数中没有函数x、y,即变量x、y不存在与main函数中。
- 对a、b进行赋值,并将a、b的值复制给add函数的两个参数,赋值时,a、b的值均为1
- 进入add函数内部,x、y被赋以a、b的值
- add函数将结果返回,x、y、z的值被“丢弃”,生命周期结束,函数将数值赋值给c
4.总结
局部变量,生命周期如其名字,只“存活”在局部。而这里的局部指的就是函数的内部,一旦它所在的函数执行结束,它的生命周期也随之结束。在使用局部变量时(尤其是指针类变量),要注意它的作用范围,不然可能造成不可控制的错误。
二、全局变量
变量分为局部与全局,局部变量又可称之为内部变量。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。
全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。[以上来自百度百科]
全局变量的定义和声明在此不做讲解,待博主学成归来会另出一篇详细讲解,会回来这里粘贴链接。
全局变量的定义和声明:【待补充】
1.总结
全局变量,存储在静态存储区中,生命周期同样如其名字,存活在“全局”。而这里的全局,往往指的是整个c文件。全局变量往往定义在函数外部(如.h文件中)。
特殊-静态变量
静态变量(Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量。与之相对应的是在运行时只暂时存在的自动变量(即局部变量)与以动态分配方式获取存储空间的一些对象,其中自动变量的存储空间在调用栈上分配与释放。
[以上来自百度百科]
1.定义格式
静态变量定义格式:
static ElemType value_name;
2.代码例子
静态变量一个经典的例子就是输出阶乘表。下面的fact_s()函数没有使用循环语句实现阶乘,而是靠静态变量f保存上次函数调用的值,递归计算得到(n-1)!的值,再乘上n,就得到n!。注意此处的fact_s()仅靠单次调用是无法得到n!的。
#include <stdio.h>
double fact_s(int n);
int main(void){
int i, n;
printf("Input n:");
scanf("%d", &n);
for (i=1; i<=n; i++){
printf("%3d! = %.f\n", i, fact_s(i)); //输出i和i!
}
return 0;
}
double fact_s(int n){
static double f = 1; //定义静态变量,第一次赋值为1
f = f*n;
return (f);
}
运算结果如下:
3.总结
静态变量,存放在静态存储区中,不会像普通局部变量因为函数调用结束而被系统收回,它的生存周期也会持续到程序结束。
本文内容为个人学习总结所得,如有错误欢迎指正。