c语言函数存储等级 c语言数据的存储

c语言中函数默认存储类型是什么c语言中的存储类型有static 、auto、extern、及register,函数默认的存储类型应该是extern,意思是具有外部链接性的 。一般来说,会通过extern来声明函数 。比如下面的代码,在1.c中定义一个函数 , 函数的声明写在1.h头文件中,在2.c中通过添加1.h的头文件 , 来声明及调用函数f() 。
//1.c
void f() { ; }
//1.h
extern void f();
//2.c
#include "1.h"
int main() { f();}
C语言中函数的隐含存储类型auto
自动存储类别
关于动态存储方式与静态动态存储方式
从变量c语言函数存储等级的作用域(即从空间)角度来分c语言函数存储等级 , 可以分为全局变量和局部变量 。
从另一个角度,从变量值存在的作时间(即生存期)角度来分 , 可以分为静态存储方式和动态存储方式 。
静态存储方式:是指在程序运行期间分配固定的存储空间的方式 。
动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式 。
用户存储空间可以分为三个部分:
程序区;
静态存储区;
动态存储区 。
全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放 。在程序执行过程中它们占据固定的存储单元 , 而不动态地进行分配和释放 。
动态存储区存放以下数据:
函数形式参数;
自动变量(未加static声明的局部变量);
函数调用实的现场保护和返回地址 。
对以上这些数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间 。
在C语言中,每个变量和函数有两个属性:数据类型和数据的存储类别 。
auto变量
函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的 , 数据存储在动态存储区中 。
函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间 。这类局部变量称为自动变量 。自动变量用关键字auto作存储类别的声明 。例如:int f(int a){/* 定义f函数,a为参数 */auto int b,c=3;/*定义b,c自动变量*//* …… */}
a是形参,b,c是自动变量,对c赋初值3 。执行完f函数后 , 自动释放a,b,c所占的存储单元 。
关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式 。
用static声明局部变量
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static进行声明 。
【例8-15】考察静态局部变量的值 。
#include stdio.hint f(int a){auto int b=0;static int c=3;b=b 1;c=c 1;return (a b c);}int main(void){int a=2,i;for(i=0;i3;i)printf("%d\n",f(a));return 0;}
对静态局部变量的说明:
静态局部变量属于静态存储类别,在静态存储区内分配存储单元 。在程序整个运行期间都不释放 。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放 。
静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行 , 每调用一次函数重新给一次初值 , 相当于执行一次赋值语句 。
如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量) 。而对自动变量来说 , 如果不赋初值则它的值是一个不确定的值 。
【例8-16】打印1到5的阶乘值 。
#include stdio.hint fac(int n){static int f=1;f=f*n;return f;}int main(void){int i;for(i=1;i=5;i)printf("%d!=%d\n",i,fac(i));return 0;}
register变量
为c语言函数存储等级了提高效率 , C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明 。
【例8-17】使用寄存器变量 。
#include stdio.hint fac(int n){register int i,f=1;for(i=1;i=n;i)f=f*i;return f;}int main(void){int i;for(i=0;i=5;i)printf("%d!=%d\n",i,fac(i));return 0;}
对寄存器变量的几点说明:
只有局部自动变量和形式参数可以作为寄存器变量;
一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;
局部静态变量不能定义为寄存器变量 。
用extern声明外部变量
外部变量(即全局变量)是在函数的外部定义的 , 它的作用域为从变量定义处开始,到本程序文件的末尾 。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了 。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明” 。表示该变量是一个已经定义的外部变量 。有了此声明 , 就可以从“声明”处起,合法地使用该外部变量 。
C语言中函数是如何存储的1. 代码本身是存储在内存的代码段中的,而函数没有说存储的概念,函数调用时是通过栈来实现的 。
2.在函数体内声明的变量在默认情况下都是auto存储类型
在代码块之间传递信息的一种方法就是使用外部变量 。当一个变量在函数的外部被声明时,安的存储空间是永久分配的,安人存储类型是extren.外部变量的声明看上去和函数或代码块内部所声明的变量一样 。外部变量对于它之后的所有函数都有效 。在代码块或函数后,外部变量仍然存在 。
3.static的基本用途是允许一个局部变量在重新进入代码块时能够保持原来的值 。这和自动变量形成了鲜明的对比,自动变量在代码块时会被销毁,再次进入这个代码块时,它必须重新进行初始化 。
4.egister存储类型告诉编译器相关的变量应该改量存储在高速度的寄存器中 。使用register存储类型的目的一般是为了提高执行速度,但是,register声明只是向编译器所提出的“建议” , 并非强制要求 。
C语言关于函数变量的四个存储类型在函数体内声明的变量在默认情况下都是auto存储类型
在代码块之间传递信息的一种方法就是使用外部变量 。当一个变量在函数的外部被声明时,安的存储空间是永久分配的,安人存储类型是extren.外部变量的声明看上去和函数或代码块内部所声明的变量一样 。外部变量对于它之后的所有函数都有效 。在代码块或函数后,外部变量仍然存在 。
static的基本用途是允许一个局部变量在重新进入代码块时能够保持原来的值 。这和自动变量形成了鲜明的对比,自动变量在代码块时会被销毁,再次进入这个代码块时,它必须重新进行初始化 。
register存储类型告诉编译器相关的变量应该改量存储在高速度的寄存器中 。使用register存储类型的目的一般是为了提高执行速度,但是,register声明只是向编译器所提出的“建议”,并非强制要求 。
C语言中,函数的隐含存储类别是 auto 还是 extern,为什么两种答案我都看到过函数的存储类型指的是其他文件模块可否访问,其类别可以是extern或static 。
static是指该函数只能被本源程序文件道中的模块访问 。extern是指可被本源程序文件外的模块访问 。
C语言中函数的存储类型隐含为版全局的,因此默认为extern 。
函数内定义的变量,默权认作用域在本函数内,即其类型是auto 。
扩展资料c语言函数存储等级:
C语言中提供c语言函数存储等级了存储说明符auto、register、extern、static说明的四种存储类别 。四种存储类别说明符有两种存储期:自动存储期和静态存储期 。
其中auto和register对应自动存储期 。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销 。在函数内部定义的变量成为局部变量 。在某些C语言教材中,局部变量称为自动变量,这就与使用可选关键字auto定义局部变量这一作法保持一致 。
extern用在变量声明中常常有这样一个作用:要在*.c文件中引用另一个文件中的一个全局的变量,那就应该放在*.h中用extern来声明这个全局变量 。
extern用于变量的用法:
1、extern int a;//声明一个全局变量a
2、int a; //定义一个全局变量a
3、extern int a =0 ;//定义一个全局变量a 并给初值 。一旦给予赋值,一定是定义,定义才会分配存储空间 。(注意:经过测试在GCC中,这样定义变量是不能通过编译的,而在VS2013可以)
参考资料来源:百度百科——extern
参考资料来源:百度百科——auto
C语言中变量的存储类型有哪几种,存储方式哪几种?谢喽在C语言中 , 对变量的存储类型说明有以下四种:
1、auto自动变量
2、register寄存器变量
3、extern外部变量
4、static静态变量
所谓存储类型是指变量占用内存空间的方式,也称为存储方式 。
变量的存储方式可分为“静态存储”和“动态存储”两种 。
1、静态存储变量通常是在变量定义时就在存储单元并一直保持不变,直至整个程序结束 。
2、动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放 。典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配 , 调用函数完毕立即释放 。
如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元 。从以上分析可知 , 静态存储变量是一直存在的,而动态存储变量则时而存在时而消失 。
扩展资料:
变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域 , 局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域 。
一、从作用域看:
1、全局变量具有全局作用域 。全局变量只需在一个源文件中定义,就可以作用于所有的源文件 。当然,其他不包含全局变量的定义的源文件需要用extern关键字再次声明这个全局变量 。
2、静态局部变量具有局部作用域,它只被初始化一次 , 自从第一次被初始化直到程序运行结束一直存在,它和全局变量的区别在于全局变量对所有函数都是可见的,而静态局部变量只对定义自己的函数体始终可见 。
3、局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后 , 变量被撤销,其所占用的内存也被收回 。
4、静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域 。这样即使两个不同的源文件都定义了相同名字的静态全局变量 , 它们也是不同的变量 。
二、从分配空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间 。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式 。这两者在存储方式上并无不同 。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的 。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一个源程序的其他源文件中不能使用它 。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用 , 因此可以避免在其他源文件中引起错误 。
1、静态变量会放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值 。这一点是它与堆栈变量和堆变量的区别 。
2、变量用static告知编译器 , 自己仅仅在变量的作用范围内可见 。这一点是它与全局变量的区别 。
参考资料来源:百度百科-变量-存储类型
【c语言函数存储等级 c语言数据的存储】c语言函数存储等级的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于c语言数据的存储、c语言函数存储等级的信息别忘了在本站进行查找喔 。

    推荐阅读