理论教育 C语言程序设计:局部变量的存储机制

C语言程序设计:局部变量的存储机制

时间:2023-11-02 理论教育 版权反馈
【摘要】:局部变量的存储类别是指局部变量在内存中的存储方式,局部变量可存放于内存的动态存储区、寄存器或内存的静态存储区中。这种变量的声明形式如下:例如:寄存器存储类型变量的作用域、生存期与自动存储类型变量相同。可以使用静态局部变量来计算前n项的和。

C语言程序设计:局部变量的存储机制

局部变量的存储类别是指局部变量在内存中的存储方式,局部变量可存放于内存的动态存储区、寄存器或内存的静态存储区中。

1.自动存储类型变量

自动存储类型变量的存储单元被分配在内存的动态存储区中。自动存储类型变量的声明形式如下:

自动存储类型是系统默认的类型。因此,在函数内部,下面两种定义方式等效:

函数(或复合语句)内不作特别声明的变量、函数的形参,都是自动存储类型的,它们只有在系统执行函数(或复合语句)时才被分配内存单元,在该函数(或复合语句)运行期间一直存在,在函数(或复合语句)运行结束时,自动释放这些内存单元。

自动存储类型变量的作用域和生存期是一致的,在其生存期内都是有效的、可见的。

函数内部的自动存储类型变量在每次调用函数时,系统都会在内存的动态存储区为它们重新分配内存单元,在该函数被多次调用的过程中,函数内的某个自动存储类型变量的存储位置不固定。

2.寄存器存储类型变量

寄存器存储类型变量的存储单元被分配在寄存器中。这种变量的声明形式如下:

例如:

寄存器存储类型变量的作用域、生存期与自动存储类型变量相同。

由于寄存器的存取速度比内存的存取速度快,因此通常将频繁使用的变量放在寄存器中(如循环体中涉及的内部变量),以提高程序的执行速度。

由于计算机中寄存器的个数有限,寄存器的数据位数也有限,因此定义寄存器存储类型变量的个数不能太多,并且只有整型变量和字符型变量可以定义为寄存器存储类型变量。

通常,寄存器存储类型变量的定义是不必要的,如今优化的编译系统能够识别频繁使用的变量,并能够在不需要编程声明的情况下,就把这些变量存放在寄存器中。(www.daowen.com)

3.静态存储类型变量

静态存储类型变量所需的存储单元被分配在内存空间的静态存储区中。静态存储类型变量的声明形式如下:

静态存储类型变量在编译时被分配内存、赋初值,并且只被赋初值一次。对未赋值的静态存储类型变量,系统自动为其赋值为0(字符型为'\0')。

在整个程序运行期间,静态存储类型变量占用静态存储区的固定的内存单元,即使它所在的函数调用结束,也不释放该存储单元,其值会继续保留。因此,下次调用该函数时,静态存储类型变量仍然使用原来的存储单元,仍使用原来存储单元中的值。利用静态存储类型变量的这个特点,可以编写需要在被调用结束后仍保存局部变量值的函数。

静态存储类型的局部变量的作用域仍然是定义该变量的函数(或复合语句)内部。

虽然静态存储类型变量在整个程序运行期间都是存在的,但是在它的作用域外,它是不可见的,即它不能被其他函数引用。

例6.13 已知数列的通项公式为an=n2。请输出该数列的前10项,然后计算并输出该数列的前n项和(n的取值分别是1、2、3、4、5、6、7、8、9、10)。

【分析】可以循环10次,每次输出n2,即可输出数列的前10项。对于数列的前n项,n=1时,为前1项的和,输出12;n=2时,为前2项的和,输出12+22;n=3时,为前3项的和,输出12+22+32;照此类推,n=10时,为前10项的和,输出12+22+32+…+102。可以使用静态局部变量来计算前n项的和。

程序代码如下:

运行程序,程序输出如下:

【分析】在该程序中,函数st中的静态存储类型变量t在静态区被分配存储单元,并初始化为0。函数main调用了函数st M次,变量t的值在每次调用之后不释放,当下一次调用函数st时,执行“t=t+n*n;”,用t的原值与n*n相加。

程序从函数main开始运行。在函数main中,第1次,输出st(1),值为1即12;第2次,输出s(2),值为5,即12+22;第3次,输出s(3),值为14,即12+22+32;……;第10次,输出s(10),值为385,即12+22+32+…+102。每次输出的值,也就是调用函数st返回t的值,由两部分相加,一个是t原来的值,另一个是n*n的值。例如,第10次输出的385由285+10*10组成,其中285是t原来的值,10*10是n*n(n为10)的值。 

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈