c语言函数的存储方法 c语言中如何存储数据

C语言中函数的隐含存储类型auto
自动存储类别
关于动态存储方式与静态动态存储方式
从变量的作用域(即从空间)角度来分 , 可以分为全局变量和局部变量 。
从另一个角度,从变量值存在的作时间(即生存期)角度来分 , 可以分为静态存储方式和动态存储方式 。
静态存储方式:是指在程序运行期间分配固定的存储空间的方式 。
动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式 。
用户存储空间可以分为三个部分:
程序区;
静态存储区;
动态存储区 。
全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区 , 程序行完毕就释放 。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放 。
动态存储区存放以下数据:
函数形式参数;
自动变量(未加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语言中如何存储数据】为了提高效率,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语言数据文件有几种存储方式?每种存储形式各有什么特点?一、auto auto称为自动变量 。局部变量是指在函数内部说明的变量(有时也称为自动变量) 。用关键字auto进7行说明, 当auto省略时, 所有的非全程变量都被认为是局部变量, 所以auto实际上从来不用 。局部变量在函数调用时自动产生, 但不会自动初始化, 随函数调用的结束, 这个变量也就自动消失了, 下次调用此函数时再自动产生, 还要再赋值, 退出时又自动消失 。二、staticstatic称为静态变量 。根据变量的类型可以分为静态局部变量和静态全程变量 。1. 静态局部变量它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它、函数使用, 当再次进入该函数时, 将保存上次的结果 。其它与局部变量一样 。2. 静态全程变量Turbo C2.0允许将大型程序分成若干独立模块文件分别编译, 然后将所有模块的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护 。静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量 。它与全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用,而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用 。三、externextern称为外部变量 。为了使变量除了在定义它的源文件中可以使用外, 还要被其它文件使用 。因此, 必须将全程变量通知每一个程序模块文件, 此时可用extern来说明 。四、registerregister称为寄存器变量 。它只能用于整型和字符型变量 。定义符register说明的变量被Turbo C2.0存储在CPU的寄存器中, 而不是象普通的变量那样存储在内存中, 这样可以提高运算速度 。但是Turbo C2.0只允许同时定义两个寄存器变量,一旦超过两个, 编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量来处理 。因此, 寄存器变量常用在同一变量名频繁出现的地方 。另外, 寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量,因此, 不能用作全程变量 。定义一个整型寄存器变量可写成:register int a;
C语言,函数是存储在代码区,想问代码区是栈区吗?代码区是独立的一个区,不属于栈区
1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等 。其
操作方式类似于数据结构中的栈 。
2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回
收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵 。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另
一块区域 。- 程序结束后由系统释放 。
4、文字常量区 —常量字符串就是放在这里的 。程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码 。
C语言关于函数变量的四个存储类型在函数体内声明c语言函数的存储方法的变量在默认情况下都是auto存储类型
在代码块之间传递信息的一种方法就是使用外部变量 。当一个变量在函数的外部被声明时c语言函数的存储方法,安的存储空间是永久分配的,安人存储类型是extren.外部变量的声明看上去和函数或代码块内部所声明的变量一样 。外部变量对于它之后的所有函数都有效 。在代码块或函数后,外部变量仍然存在 。
static的基本用途是允许一个局部变量在重新进入代码块时能够保持原来的值 。这和自动变量形成c语言函数的存储方法了鲜明的对比,自动变量在代码块时会被销毁,再次进入这个代码块时,它必须重新进行初始化 。
register存储类型告诉编译器相关的变量应该改量存储在高速度的寄存器中 。使用register存储类型的目的一般是为了提高执行速度,但是,register声明只是向编译器所提出的“建议” , 并非强制要求 。
在C语言里标准函数存放在什么文件中?C语言标准库函数存放在头文件当中c语言函数的存储方法,使用相应函数时需要用include引用先关头文件 。
C语言程序设计里c语言函数的存储方法,C 标准函数(C Standard library)是所有目前符合标准的头文件(head
file)的集合c语言函数的存储方法,以及常用的函数库实现程序c语言函数的存储方法,例如 I/O输入输出和字串符控制 。不像 COBOL、Forrian和 PL/I等编程语言,在 C
语言的工作任务里不会包含嵌入的关键字,所以几乎所有的 C 语言程序都是由标准函数库的函数来创建的 。
下面列出C89及C99中C语言标准函数库的头文件 。
C89中标准的头文件
assert.h 设定断言点
ctype.h 字符处理
errno.h 错误报告
float.h 定义与实现相关的浮点值勤
limits.h 定义与实现相关的各种极限值
locale.h 支持函数setlocale()
math.h 数学函数库使用的各种定义
setjmp.h 支持非局部跳转
signal.h 定义信号值
stdarg.h 支持可变长度的变元列表
stddef.h 定义常用常数
stdio.h 支持文件输入和输出
stdlib.h 其c语言函数的存储方法他各种声明
string.h 支持串函数
time.h 支持系统时间函数
C99新增的头文件和库
complex.h 支持复数算法
fenv.h 给出对浮点状态标记和浮点环境的其他方面的访问
inttypes.h 定义标准的、可移植的整型类型集合 。也支持处理最大宽度整数的函数
iso646.h 首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏
stdbool.h 支持布尔数据类型类型 。定义宏bool,以便兼容于C
stdint.h 定义标准的、可移植的整型类型集合 。该文件包含在inttypes.h中
tgmath.h 定义一般类型的浮点宏
wchar.h 首先在1995年第一次修订时引进 , 用于支持多字节和宽字节函数
wctype.h 首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数
c语言函数的存储方法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言中如何存储数据、c语言函数的存储方法的信息别忘了在本站进行查找喔 。

    推荐阅读