C语言中函数的隐含存储类型

 我来答
BP哥1
推荐于2017-09-24 · TA获得超过1398个赞
知道小有建树答主
回答量:572
采纳率:100%
帮助的人:242万
展开全部

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.h>int 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;i<3;i++)        printf("%d\n",f(a));    return 0;}


对静态局部变量的说明:

静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。

静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。


【例8-16】打印1到5的阶乘值。

#include <stdio.h>int 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语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。

【例8-17】使用寄存器变量。

#include <stdio.h>int 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对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
转瞬F即逝
2012-10-26
知道答主
回答量:23
采纳率:0%
帮助的人:19.6万
展开全部
由于C函数内不能再定义函数,C函数的存储类型只能是静态的或外部的之一。若定义函数时不指定存储类型是静态的,则它的存储类型就是外部的(extern),即函数允许被程序的其它函数调用。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
占衍湛盼芙
2019-12-22 · TA获得超过3904个赞
知道大有可为答主
回答量:3158
采纳率:32%
帮助的人:169万
展开全部
extren
就是
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
a1012144015
2015-05-23 · TA获得超过6415个赞
知道大有可为答主
回答量:9038
采纳率:40%
帮助的人:1362万
展开全部
extren 就是
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
E网E友
2010-07-15 · TA获得超过1832个赞
知道小有建树答主
回答量:1422
采纳率:0%
帮助的人:1919万
展开全部
自动类型即auto
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式