当前位置:首页 » 存储配置 » 函数的隐含存储类型

函数的隐含存储类型

发布时间: 2022-08-02 04:04:09

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.h>intf(inta){autointb=0;staticintc=3;b=b+1;c=c+1;return(a+b+c);}intmain(void){inta=2,i;for(i=0;i<3;i++)printf("%d
",f(a));return0;}


对静态局部变量的说明:

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

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

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


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

#include<stdio.h>intfac(intn){staticintf=1;f=f*n;returnf;}intmain(void){inti;for(i=1;i<=5;i++)printf("%d!=%d
",i,fac(i));return0;}

register变量

为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。

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

#include<stdio.h>intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f*i;returnf;}intmain(void){inti;for(i=0;i<=5;i++)printf("%d!=%d
",i,fac(i));return0;}


对寄存器变量的几点说明:

只有局部自动变量和形式参数可以作为寄存器变量;

一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;

局部静态变量不能定义为寄存器变量。

用extern声明外部变量

外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

⑵ c语言中,函数的隐含存储类别及形参的默认存储类别分别是

c语言中,函数的隐含存储类别是extern
形参的默认存储类别是auto

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

函数的隐含存储类型是extern,按照C语言的原则,函数隐含为全局都可以访问,因此默认为extern,而auto只用于变量,是变量的隐含存储类型。

⑷ 函数中未指定存储类别的局部变量,其隐含的存储类别为()

函数中未指定存储类别的局部变量,其隐含的存储类别为自动存储类别。

函数中的局部变量,如果不专门声明为static存储类别,都是动态的分配存储空间的,数据存储在动态存储区中。

这类变量叫做自动变量,自动变量可以用关键字auto作为存储类别的声明,实际上关键字auto是可以省略的(一般都是不写的),不写则自动隐含为“自动存储类别“。

(4)函数的隐含存储类型扩展阅读:

默认情况下,在代码块内声明的变量都是自动变量,但亦可用自动变量的关键字auto明确标识存储类;而如若使用register(而非auto)存储类标识代码块内的变量,编译器就会将变量缓存于处理器内的寄存器中,此种情况下不能对该变量或其成员变量使用引用操作符&以获取其地址,因为&只能获取内存空间中的地址。

除此以外,由于寄存器的数量及其所能存储的数据类型受硬件限制而可能无法存储指定变量,编译器可以忽略声明内的register关键字。对于一个未初始化的自动变量来说,在为其赋值之前其值都为undefined(未定义)。

在C++中,如谚语“资源获取即初始化”(Resource Acquisition Is Initialization,常缩写为RAII)所述,自动变量的构造函数在程序运行至声明部分的时候才会被调用,而当程序运行至所给的程序块末端的时候则调用析构函数,这一特性常应用于资源的分配与释放管理,如自动关闭已开启的文件或自动释放空闲内存。

⑸ C语言中,函数的隐含存储类型是:A. auto B.static C.extern D.register

C。

C语言规定,只要在定义函数时不进行存储类型的显式说明,函数的存储类型就隐含为外部类型,即extern型,外部类型允许其他文件中的函数调用。

实际上函数的声明和定义都不需要添加extern关键字,在实际使用的时候也最好不要添加关键字。

如果一个函数是不会被其它文件调用的,那么这个函数应该被声明成static的。

如:

extern int func(void){

return 0;

}

int func(void){

return 0;

}

是等价的,另外

extern int func(void);

int func(void);是等价的。

(5)函数的隐含存储类型扩展阅读:

函数调用的一般形式为:

函数名(实参表列);

如果是调用无参函数,则"实参表列"可以没有,但括号不能省略。如果实参表列包含多个实参,则个参数间用逗号隔开。实参与形参的个数应相等,类型应一致。

实参与形参按顺序对应,一一传递数据。但应说明,如果实参表列包括多个实参,对实参求值的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序

网络-c函数

⑹ 18. 在C语言中,函数的隐含存储类别是( )。 (A) auto (B) static (C) extern (D) 无存储类别

形参是放在堆栈中的除非特殊声明的函数如cxxbuilder
fastcall!所以选a;
参数一般不会声明为寄存器变量的!这样的函数没有办法调用!
因为形参放在何处由函数的调用约定来确定,而不是由参数的存储类型决定!
同样外部变量或静态变量也不会,不能定义成寄存器变量。
寄存器变量只适合函数内部定义的,用完不管的,通常是循环的计数变量!
静态和外部是常用的两个存储类型。
外部变量一定在函数外部定义,这就是c,c++,外部变量中的“外部”的真实含义。
静态变量,可以定义在
1)函数外部,属于文件模块的,表示文件内部的具有全局性质的局部变量(存储在全局数据区。
2)函数内部,第一层大括号内,属整个函数全局性质的局部变量。
存储在全局数据区。
3)函数内部的任何非数据定义的两个大括号内部;
分程序(c一般叫语句组)属整个分程序全局性质的局部变量。存储在全局数据区。
而函数内的非静态数据缺省为自动变量,所auto一般会省略不写。
外部变量,一般定义时也省略掉extern,
只有在头文件里,和使用非本文件定义的外部变量时,以及函数内部引用外部变量时,
才写上extern
表示这是引用说明,不是定义,要看定义别处找找。
如果本文件没定义,就是引用别的文件的同名变量!
所以除了函数参数(形参)和函数内部非静态变量,再没有自动变量了。
函数内部可以定义三种变量,局部静态变量,自动变量,寄存器变量;外部变量在函数内部只能有引用说明!不能在函数内部定义!
extern外部,静态static两个存储类型是相对的。
外部变量,全部在函数外部定义。外部变量,分配在全局数据区,是全局变量。
外部是相对函数的。
静态有定义在函数内部,和函数外部的区分,还有函数内部全局,和函数内部某一语句组内部的区分,实际上,无论哪种静态变量,都属于全局变量,分配在全局数据区。
ps:
除了变量外,函数也有
extern外部,静态static
两种存储类型。
由于c语言不允许函数内部定义函数。
所以函数只有这两种存储类型。
函数的缺省存储类型是extern,
所以无论定义,还是引用说明,通常都会省略extern;
c语言中,只有写了static的函数,才是静态函数。
c语言中,函数可以在函数内部,有引用说明,不会在函数定义在函数内部。
c++中
类也有静态变量和静态函数;
由于类的静态函数和静态变量的外部定义会有类名和作用域限定符(也叫作用域运算符)::作为前缀,所以类外定义不写static;
类也有静态变量和静态函数的含义是这个变量和函数属于整个类的(实际也是全局变量,分配在全局数据区),除了类和他的成员,外不能使用它了。
类通过类名,成员通过它本身(obj.
;pobj->;
(*pobj).
refobj.
类名::)使用;
只要类本身定义了。
不通过类的对象,就可以使用类的静态变量和静态函数。
其他成员,除了构造函数外都必须通过通过类的对象,才能使用。

⑺ C语言中,实参的隐含存储类型是 形参的隐含存储类型是 A、auto B、static C、extern D、register

答案都选A:上面几位胡说霸道。
不是static 形参存储类型只有两种可能,一是auto类型,而是register类型。我给你细细解说
auto 就是堆栈存储 而register的是cpu内部寄存器存储
具体函数的形参采用那种存储方法,这和函数的“调用规则(calling convention)”有关。
调用规则主要设计参数的传递,入栈顺序,寄存器传参,函数返回值的存储和清栈者,调用规则主要有 cdecl stdcall thiscall fastcall等等。栈是函数调用必需的数据结构。你可以在函数声明是注明函数的调用规则:如 int cdecl add (int a,int b) 。 注意函数有默认的调用规则,所以你再写程序时,没有必要注明调用规则。你此外还可以添加编译选项修改调用规则。
cdecl : (c/c++语言默认的调用规则):堆栈传参参数,因此是auto类型。
stdcall :有叫做pascal,WINAPI,这个调用规则出现在windows的API函数中。它也采用堆栈传递参数。
thiscall:类中的函数的调用方式:参数传递和编译器有关 Windows VC中 this指针用ECX寄存器存储,而unix gcc中 this用栈存储。其他参数也是用栈存储。
fastcall:用寄存器存储部分参数加快函数调用,其他参数用栈存储。
所以,没有隐含的存储类型,形参的存储类型和调用规则有关。但是如果真要学究般的考虑这个问题,则答案选A,因为C语言函数的默认调用方式是cdecl,它的参数传递只采用了栈,因此是auto(答案A)
而实参的存储类型可以是A,B,C,D四种,隐含的类型(也就是你在定义变量是,不指明存储类型)是auto(答案A)

⑻ 在C语句中,函数隐含的存储类型是________

extern 型

⑼ C语言中,函数的隐含存储类别是 auto 还是 extern,为什么两种答案我都看到过

函数的存储类型指的是其他文件模块可否访问,其类别可以是extern或static。

static是指该函数只能被本源程序文件道中的模块访问。extern是指可被本源程序文件外的模块访问。

C语言中函数的存储类型隐含为版全局的,因此默认为extern。

函数内定义的变量,默权认作用域在本函数内,即其类型是auto。

(9)函数的隐含存储类型扩展阅读:

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可以)

⑽ C语言中函数隐含存储类型是什么

函数的隐含存储类型是extern,按照c语言的原则,函数隐含为全局都可以访问,因此默认为extern,而auto只用于变量,是变量的隐含存储类型。

热点内容
服务器地址访问不到 发布:2024-10-05 18:20:55 浏览:688
手机解锁忘记密码多少钱 发布:2024-10-05 18:14:25 浏览:784
linux乱码问题 发布:2024-10-05 18:00:25 浏览:542
访客仪需要电脑做服务器吗 发布:2024-10-05 17:57:57 浏览:9
怎么在u盘设置密码 发布:2024-10-05 17:55:23 浏览:579
石器时代赚钱脚本 发布:2024-10-05 17:48:55 浏览:364
光存储器有哪些 发布:2024-10-05 17:48:20 浏览:706
java执行js 发布:2024-10-05 17:39:01 浏览:357
常见的数据结构与算法 发布:2024-10-05 17:29:13 浏览:895
循环节c语言 发布:2024-10-05 17:28:29 浏览:25