‘壹’ 简述静态局部变量和自动变量的区别,并举例说明 c语言的 急求答案
生命周期不同:
1、动态变量生命周期仅为函数执行时间周期,该函数调用结束,变量销毁;
2、静态变量生命周期延长到整个程序执行结束(不是该函数调用结束,是main函数结束),本次函数调用结束,变量不销毁,再次调用该函数
该变量保留上一次的值。
‘贰’ C语言中的“局部变量”是什么意思
局部变量是指在程序中,只在特定过程或函数中可以访问的变量,是相对于全局变量而言的。
在C语言中,局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。
#include
int fun(int a)
{
int temp; // 变量temp就是定义的一个局部变量,在fun函数执行完后,其在内存中占用的内存区就会释放回收
temp = 2*a;
return temp;
}
int b; // 变量b就是一个全局变量,当程序执行完后,才释放其占用的内存
void main()
{
int a=2; // 变量a也是局部变量
b = fun();
}
‘叁’ C语言中的全局变量和局部变量分别是指什么
解答问题前,先说明一下,当全局变量和局部变量同名时,要看当前代码所处的作用域,默认使用当前作用域内的同名局部变量。
分析你所提供的代码:
#include
int a = 4;
//全局变量
int f(int n)
{
int t = 0;
static int a = 5;
//局部静态变量
if( n%2 )
{
int a = 6;
// if作用域内局部变量
t += a++;
// 此处的a是指if作用域内的局部变量,该变量在作用
// 域结束后,生存周期结束。
}
else
{
int a = 7; // else作用域内局部变量
t += a++;
// 此处的a是指else作用域内的局部变量
// 作用域结束后,生存周期结束
}
return t+a++;
// 此外的a是指f函数作用域内的静态局部变量,
// 每次f函数调用return后,此静态局部变量a自增1
}
int main ( void )
{
int s=a, i=0;
// 根据作用域,此处的a是指全局变量,所以s初始值为4
for(;i<2;i++) s+=f(i);
printf("%d\n",s);
return 0;
}根据以上,分析运行流程:
由上可知,s初始值为4;
当i=0时,第一次循环,调用f()函数,由于0%2为0,会进入else后代码,此时t=0+7=7,调用f()函数的return时,会返回7+5=12,同时f()函数的静态局部变量a由5变为6(下次调用生效),s=4+12=16。
当i=1时,第二次循环,调用f()函数,由于1%2为1,会进入if后代码,此时t=0+6=6,调用f()函数的return时,会返回6+6=12,同时f()函数的静态局部变量a由6变为7(下次调用生效),s=16+12=28。
当i=2时,循环终止,打印s值为28。
关于最后的问题,是因为f()函数中if后面的变量a作用域只限制在if后的花括号内,代码退出该作用域后,该变量生存周期结束而被释放,return中使用的a是f()函数中定义的静态局部变量a,所以,不管前者如何赋值,对return中的a没有影响。
‘肆’ C语言中 局部变量和全局变量都是存储在什么区
C语言中局部变量存在栈里,全局变量存静态存储区。
局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。
全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;
(4)c语言自动变量和局部变量扩展阅读
C语言中局部变量和全局变量示例:
#include<stdio.h>
#include<malloc.h>
staticints1=0,s2=0,s3=0;//静态变量放在静态区
intg1=0,g2=0,g3=0;//全局变量放在静态区
voidmain()
{
staticints4=0,s5=0,s6=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//静态变量
inta1=0,a2=0,a3=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//局部变量放在栈区
charc1[]="aabb";//局部变量放在栈区
char*c2="aabb";//字符常量放在静态区
char*m1=(char*)malloc(1);//堆区
char*m2=(char*)malloc(1);//堆区
char*m3=(char*)malloc(1);//堆区
printf("动态数据区 ");
printf("a1 a2 a3 ",&a1,&a2,&a3);
printf("c1 ",c1);
printf("m1 m2 m3 ",&m1,&m2,&m3);
printf("静态数据区 ");
printf("s1 s2 s3 ",&s1,&s2,&s3);
printf("g1 g2 g3 ",&g1,&g2,&g3);
printf("s4 s5 s6 ",&s4,&s5,&s6);
printf("c2 ",c2);
}
‘伍’ 关于c语言auto变量和static变量区别
一、主体不同
1、auto变量:是一个C/C++语言存储类型,仅在语句块内部使用。
2、static变量:在计算机编程领域指在程序执行前系统就为之静态分配存储空间的一类变量。
二、作用域范围不同
1、auto变量:初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式。
2、static变量:针对某一源文件的以static声明的文件级变量与函数的作用域只限于文件内(只在文件内可见),也即“内部连接”,因而可以用来限定变量的作用域。
三、特点不同
1、auto变量:具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
2、static变量:在函数内以static声明的变量虽然与自动局部变量的作用域相同,但存储空间是以静态分配而非默认的自动分配方式获取的,因而存储空间所在区域不同。
‘陆’ C语言中的全局变量和局部变量
局部变量是在某一函数内定义的变量,有效区域在本函数里。
全局变量定义在函数外,全局起作用。
‘柒’ c语言中什么时候用全局变量什么时候用局部变量
1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用(尤其是短名全局变量的变量名污染很严重),因此仍以采用局部静态变量为宜。
简单的说静态局部变量与全局变量最明显的区别就在于:全局变量在其定义后所有函数都能用,但是静态局部变量只能在一个函数里面用。
‘捌’ C语言中自动变量是什么变量它是动态变量的意思吗怎么理解
局部变量,如不作专门说明为静态变量,都是动态分配存储空间,存储在动态存储区中。这种变量叫自动变量。这种变量只在定义它们的时候才创建,在定义它们的函数返回时系统回收变量所占存储空间。对这些变量存储空间的分配和回收是由系统自动完成的,所以也叫自动变量。一般情况下,不作专门说明的局部变量,均是自动变量。
‘玖’ C语言中的自动变量和寄存器变量是什莫
一、auto
auto称为自动变量。
局部变量是指在函数内部说明的变量(有时也称为自动变量)。用关键字auto进
行说明, 当auto省略时, 所有的非全程变量都被认为是局部变量, 所以auto实际上
从来不用。
局部变量在函数调用时自动产生, 但不会自动初始化, 随函数调用的结束, 这
个变量也就自动消失了, 下次调用此函数时再自动产生, 还要再赋值, 退出时又自
动消失。
二、register
register称为寄存器变量。它只能用于整型和字符型变量。定义符register说
明的变量被Turbo C2.0存储在CPU的寄存器中, 而不是象普通的变量那样存储在内
存中, 这样可以提高运算速度。但是Turbo C2.0只允许同时定义两个寄存器变量,
一旦超过两个, 编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量
来处理。因此, 寄存器变量常用在同一变量名频繁出现的地方。
另外, 寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量,
因此, 不能用作全程变量。定义一个整型寄存器变量可写成:
register int a;
‘拾’ C语言中 自动变量 静态变量 寄存器变量 外部变量 有可比性吗区别在哪简单易懂点吧~
c语言中变量分为四类,分别是
1.auto 自动变量
2.static 静态存贮分配变量(又分为内部静态和外部静态)
3.extern 外部变量/全程变量(用于外部变量说明)
4.register 寄存器变量(分配在硬件寄存器中)
四大类,所有变量必须先说明(定义),后使用。
下面分别介绍
1.自动变量(局部变量)
局部变量:在一个函数开头或段开头处说明的变量,
它有几个特征,,
a、作用域为定义它的函数
b、编译器不会对自动变量给予隐含的初值,故其值不确定,因此每次使用前必须明确的置初值。
c、形参是自动变量,作用域仅限于相应函数内
d、自动变量随函数的引用而存在和消失,由一次调用到下一次调用之间不保持值。
2.外部变量:在函数外部定义的变量即为外部变量,它的作用域是整个程序(全程变量)。
a. c程序可以分别放在几个文件上,每个文件可以作为一个编译单位分别进行编译。外部变量只需在某个文件上定义一次,其它文件若要引用此变量时,应用extern加以说明(外部变量定义时不必加extern关键字)。
b. 在同一文件中,若前面的函数要引用后面定义的外部(在函数之外)变量时,在函数里加extern加以说明。
引进外部变量的原因:解决函数单独编译的协调;与变量初始化有关;外部变量的值是永久的;解决数据共享;
注意:函数本身也被认为是外部变量
3.静态变量:分为内部静态变量和外部静态变量
内部静态变量:a.在局部变量前加上static就为内部静态变量
b.静态局部变量仍是局部变量,其作用域仍在定义它的函数范围内,但它采用静态存贮分配(由编译程序在编译时分配,而一般的自动变量和函数形参均采用动态存贮分配,即在运行时分配空间),当函数执行完,返回调用点时,该变量并不撤销,再次调用时,其值将继续存在。
外部静态变量:a.在函数外部定义的变量前加static即为外部静态变量
b.作用域为定义它的文件,即成为该文件的私有变量,其他文件上的函数一律不得直接访问,除非通过它所在文件上的函数进行操作,这可实现数据隐 藏。
4.寄存器变量:只有自动(局部)变量和函数参数才能进一步指定为寄存器存贮类
a.使用register变量可以提高存取速度,但寄存器变量的数目依赖于具体机器,声明多了也只有前几个有效。
b.只限于int,char,short ,unsigned和指针类型用寄存类。
c.不能对register变量取地址(即&操作)