函数变量和生存期

每一个变量都有一个作用域问题,即它们在什么范围内有效。

文章目录


前言

定义变量有三种形式:

(1)在函数的开头定义;(局部变量)

(2)在函数内的复合语句定义;(局部变量)

(3)在函数的外部定义;(全局变量)


一、局部变量是什么?

局部变量在函数内部定义,且在本函数内部范围内有效

  1. 主函数内定义的变量只在主函数内有效
  2. 不同函数内可使用同名变量 
  3. 形式参数也是局部变量
  4. 一个函数中可以在复合语句内定义变量,但只在复合语句中有效,这种语句称为”程序块

二、全局变量

函数之外定义的变量,也叫全局变量,也叫外部变量,也叫全程变量

  1.  全局变量在整个程序范围内有效,可以为本文件内所有其它函数共用
  2. 有效范围从定义变量开始到本源文件结束
  3. 由于同一个文件中的所有函数都能引用全局变量的值,因此,在函数中改变了全局变量,就会影响到其它函数中全局变量的值,相当于各个函数之间有直接传递通道。
  4. 可以利用全局变量来增加函数之间的联系渠道,通过函数调用得到一个以上的值。

代码如下例:

#define M 5
int a[M];
void f2()
{
	int a[M], i, n;
	n = 3;
	for (i = 0; i < n; i++)a[i] = i;
}
void f1()
{
	for (int i = 0; i < M; i++)a[i] = i + i;
}
void f3(int a[])
{
	int i;
	for (i = 0; i < M; i++)
		printf("%d,", a[i]);
}
int main()
{
	f1();
	f3(a);
	f2();
	f3(a);
	printf("\n");
}

在这里a[M]作为全局变量,会使函数之间的有了联系通道,调用函数f1()和调用函数f3()之间的值会相互影响 ,运行结果如下:

三、变量储存方式和生存周期 

变量的值存在的时间,我们把它叫做生存期

有的变量在程序运行的整个过程中都是存在的,有的是在需要用的时候才临时分配存储单元,而在函数调用结束后该程序就立马释放。

变量的储存方式分为动态储存方式静态储存方式


1. 动态储存方式和静态储存方式

储存空间有三部分:

  1. 程序区;
  2. 静态储存;
  3. 动态储存; 

test.c——(编译)——————————(链接)——————test.exe可执行程序——执行-> 

                全局变量(静态存储区)                                                          局部变量(动态存储区)

静态储存方式:由系统自动分配好的存储单元(编译)

动态储存方式:在程序运行期根据需要进行动态的分配存储空间的方式

动态存储区又叫做栈区


2.储存类别

C语言储存类别有4种:自动(auto),静态储存(static),寄存器的(register),外部的(extern)

· 自动变量

 在函数调用时,系统会给函数分配储存空间,在函数调用结束时,自动释放这些储存空间。

 只有在使用该函数时,才占用内存单元。

· 静态局部变量

函数调用结束后,不消失而继续保留原值,其被占用的储存单元不释放。在下一次被调用时,函数已经有值(就是上一次调用结束的值)

(1)静态局部变量属于静态存储区,在静态存储区内分配存储单元。

(2)对静态局部变量是在编译时赋初值的,即只赋值一次。以后每一次调用函数不在重新赋值,而是保留上一次函数调用结束时的值;而对自动变量赋初值,不是在编译时进行,而是在函数调用时进行的,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

(3如果在定义局部变量不赋初值,则对静态局部变量来说编译器自动赋初值为0(对数值型变量)或空字符’\0‘(对字符变量);对自动变量来说,它的值是一个不确定的值,由于每次函数调用结束后存储单元已释放,而下次调用需重新分配,所分配单元是不可知的。

(4)虽然静态局部变量被调用后值仍然存在,但是其它函数不能引用它,只能在作用域范围内被引用。

但是,用静态存储需要多占内存(长期占用内存不释放,而不能像动态存储那样,一个内存空间可先后被多个变量使用,节约内存),静态就降低了内存利用率,可读性不强,若非必要,不使用静态局部变量。


· 寄存器变量

把大量重复的变量放在寄存器中,寄存器在CPU中,能大大提高代码执行效率。

不过随着技术发达,计算机速度越来越高,优化系统能自动将这些变量放在寄存器中,不需要程序设计指定。

3.全局变量的储存类别

全局变量存储在静态区,它们的生存期是固定的,存在于程序的整个运行周期。

  • 在一个文件内扩展外部变量的作用域(extern)
  • 将外部变量的作用域扩展到其它文件(extern)
  • 将外部变量的作用域限制在本文件中(static)

(1)对局部变量static的声明,把他分配在静态存储区内,该变量在整个程序执行期间不释放,其分配的空间始终存在。

(2)对全局变量static的声明,该变量的作用域受到限制,只限于本文件模块使用


总结

局部变量与全局变量同名,优先使用局部变量


 

static 

1.修饰全局变量
2.修饰局部变量
3.修饰函数

1全局变量本身是具有外部链接属性的,在A文件中可以通过【链接】使用,但是如果全局变量被static修饰,这个外部链接属性就变成了内部链接属性 ,全局变量就只能在自己所在的源文件内部使用,无论用external也不能在外部文件中被使用

本质上:

static的修饰把全局变量的外部链接属性变成内部链接属性,最终使得全局变量的作用域变小

2局部变量被static修饰,放在静态区,被使用后不会被销毁,原来的值仍保留

本质上:;

static的修饰改变了局部变量的存储位置,存储位置的差异使得执行效果不一样

而非作用域发生变化!!!

被static修饰不影响作用域!!!是生命周期发生变化

3函数本身是具有外部链接属性的,在A文件中可以通过【链接】使用,但是如果全局变量被static修饰,这个外部链接属性就变成了内部链接属性 ,函数只能在自己所在的源文件内部使用

限制了函数的作用域

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值