变量的存储类别题库共25页word资料
- 格式:doc
- 大小:48.50 KB
- 文档页数:25
1.存储类型和数据类型。
存储类型是针对变量而言的,它规定了变量的存储位置,从而也确认了其作用域和生存期;数据类型也可以针对变量,它规定了变量所占内存空间的大小。
2.C中只有两种存储类型:自动类和静态类。
全局变量只能是静态类,而局部变量可以任意。
3.说明变量存储类型的格式:<存储类型> <数据类型> <变量名表>;(存储/数据类型可以交换次序),与存储类别有关的说明符:auto(自动),static(静态),register(寄存器),extern (外部)。
4.计算机内存分三部分:动态存储区(堆栈)、静态存储区、程序代码区。
动态存储区用来保存函数调用时的返回地址、自动类别的局部变量等;静态存储区用以存放全局变量及静态类别的局部变量;程序代码区存放各类代码。
5.C++中,可以用static说明"静态函数",其不允许嵌套定义,也不允许外部编译单元中的函数对它进行调用。
******************************************************************************/ #include<stdio.h>/******************************************************************************1.对于全局变量可以使用extern和static两种说明符。
2.全局变量的定义只能出现一次,在定义全局变量时,不可使用extern说明符。
3.全局变量的说明(使用extern)可多次出现在需要的地方,说明的作用是扩展该全局变量的作用域,可以对同一变量进行多次extern声明。
4.全局变量的生存期是整个程序的运行时间。
5.全局变量可以进行不同函数之间的传值。
******************************************************************************/ int i=10; //注意:extern int i=10;是一个具体变量的定义,不是外部变量的声明int main(){/****************************************************************************** 1.static局部变量只有在第一次执行时才进行初始化,若定义时没有指定初值,编译器自动为其赋0。
(1)自动型(堆栈型)auto内部变量省略存储类型符:内部变量是指在函数内部定义的变量。
在函数或复合语句中定义变量时省略存储符,系统默认所定义变量的存储类型是自动型。
自动型所在存储区域:存储类型是自动型的变量,存储在系统内存的堆栈区。
栈区分配存储区域,函数调用结束时,C语言就释放变量,节省内存空间。
释放变量:从内存堆栈区中收回分配给变量的存储空间。
变量的初始化:可以对变量初始化,如果在定义变量时不初始化,还要用赋值语句或各种输入数据的方法给其赋值。
程序调用函数是,执行自动型变量数据定义语句,则系统为其在内存堆栈区分配存储菜单元,放入数据,函数结束时释放存储单元。
如果再一次调用所在函数,则重新为其在内存堆栈区分配存储单元,放入数据,函数结束时再一次释放存储单元。
(2)寄存器型register所在存储区域:CPU通用寄存器寄存器型变量的数量:通用寄存器在CPU中,数量很少。
通用寄存器在CPU中有很多特定的用途,所以寄存器型变量通常最多只允许2个,定义4字节或4字节以上的变量,通常不定义成寄存器型。
因此long,fioat,double,unsingedlong等其存储类型都不定义成寄存器型。
寄存器型变量过多的处理方式:如果在数据定义语句中的寄存器数量过多,所占用寄存器数量超过了所能提供寄存器的数目,编译系统将多余的寄存器变量改为自动型变量。
存储空间的存在:寄存器型变量只能在函数中定义,运行到数据语句,则为变量在CPU 通过寄存器中为其分配内存,退出函数将释放所占用寄存器。
变量的初始化:可以对变量初始化,如果在定义变量时不初始化,则以后要用赋值语句或各种输入数据的方法给其赋值。
程序调用函数时,执行寄存器型变量数据定义语句,则系统为其在寄存器配存储单元,放入数据。
函数结束时释放存储单元。
如果再一次调用所在函数,则重新为其在寄存器分配存储单元,放入数据,函数结束时再一次释放存储单元。
(3)静态型static所在存储区域:存储类型是静态型的变量,存储在系统内存的数据区。
7.3 变量的存储类型7.3.1 静态存储方式和动态存储方式变量值在内存的存在的时间来分为静态存储方式和动态存储方式。
静态存储方式:在程序运行期间分配固定的存储空间;动态存储方式:在程序运行期间根据需要进行动态的分配存储空间。
用户使用的存储空间:由程序区、静态存储区和动态存储区三部分组成(如下图所示)。
数据分别存放在静态存储区和动态存储区中。
动态存储区主要存放函数的形式参数、自动变量和函数用时的现场保护和返回地址等。
在函数调用开始分配动态存储空间,函数结束时释放这些空间。
7.3.2 变量的存储类型变量属性:数据类型属性和存储类型属性。
变量的存储类型:auto(自动)型、static(静态)型、register(寄存器)型和extern(外部)型四种。
1.Auto(自动)变量auto变量只用于定义局部变量,存储在内存中动态存储区。
定义形式为:auto <数据类型> <变量名表>;局部变量存储类型缺省时为auto型。
例如:int f (int x) /*定义f函数,x为形参*/{auto int a, b; /*定义整型变量a、b为自动变量*/float y; /*定义y,缺省存储类型时为自动变量*/…}2.static(静态)变量static型可定义全局变量和局部变量。
static(静态)变量在静态存储区分配存储单元。
在程序运行行期间自始至终占用被分配的存储空间。
定义形式为:注意:⑴静态局部变量是在编译时赋初值的。
以后每次调用函数时不再重新赋初值而只引用上次函数调用结束时的值。
⑵静态局部变量时没有赋初值,编译时自动赋0或空字符(对字符变量)。
static <数据类型> <变量名表>;【例7.4】分析下列程序运行结果。
void main( ){void f( );f( );f( );f( );}void f( ){int x=0;x++;printf("%d\t",x);}运行结果为:1 1 1将程序中语句int x=0改为static int x=0;运行结果为:1 2 3 为什么?3.register(寄存器)变量register(寄存器)变量:存放在寄存器中的变量。
第4章变量的存储类型4.1 概述C语言中的变量具有两种属性:根据变量所持有数据的性质不同而分为各种数据类型;根据变量的存储方式不同而分为各种存储类型.变量的数据类型决定了该变量所占内存单元的大小及形式;变量的存储类型规定了该变量所在的存储区域,因而规定了该变量作用时间的长短,即寿命的长短,这种性质又称为"存在性".变量在程序中说明的位置决定了该变量的作用域,即在什么范围内可以引用该变量,"可引用"又称为"可见",所以这种性质又称为"可见性".计算机的内存和CPU中的寄存器都可以存放数据,变量究竟存放在何处则由存储类来决定.存储类型用来说明变量的作用域,生存期,可见性和存储方式.下面解释几个概念:1 作用域:是该变量在其上有定义的程序部分,通俗的说,即该变量起作用的某个程序区域。
2 变量的生存期:是指它从产生到消亡的存在时间,即变量从定义开始到它所占有的存储空间被系统收回为止的这段时间。
3 变量的可见性的含义:在某个程序区域,可以对变量进行访问(或称存取)操作,我们则称该变量在该区域为可见的,否则为不可见的。
再引入几个概念:4 全局变量和局部变量在一个函数内部或复合语句内部定义的变量叫内部变量,又称为"局部变量"。
在函数外定义的变量称为外部变量,又称为"全局变量"。
如:int x ;void main( ){int a, b;float c;……..}x 定义在函数外,是全局int 型变量a,b定义在main()函数内是局部int 型变量c 定义在main()函数内是局部float 型变量6 动态存储变量和静态存储变量。
在程序运行期间,所有的变量均需占有内存,有的是临时占用内存,有的是整个程序运行过程中从头到尾占用内存。
对于在程序运行期间根据需要进行临时性动态分配存储空间的变量称为"动态存储变量",对于在程序运行期间永久性占用内存的变量称为"静态存储变量".一个正在运行的程序可将其使用内存的情况分为如下三类(如下图):程序代码区: 程序的指令代码存放在程序代码区。
习题6 参考答案一、选择题6.1 C 分析:全局变量有效范围是从定义的位置开始到所在源文件的结束,在这区域内的函数才可以调用,如果在定义函数之后,定义的变量,该变量不能被之前的函数访问所以C选项说法错误。
6.2 D 分析:auto变量又称为自动变量,函数定义变量时,如果没有指定存储类别,系统就认为所定义的变量具有自动类别,D选项正确。
static变量又称为静态变量,编译时为其分配的内存在静态存储区中。
register变量又称为寄存器变量,变量的值保留在CPU的寄存器中,而不是像一般变量那样占内存单元。
当定义一个函数时,若在函数返回值的类型前加上说明符extern时,称此函数为外部函数,外部函数在整个源程序中都有效。
6.3 A分析:auto用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。
这个关键字通常会被省略,因为所有的变量默认就是auto的。
register定义的变量告诉编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。
static变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。
这一点是它与堆栈变量和堆变量的区别。
变量用static告知编译器,自己仅仅在变量的作用范围内可见。
这一点是它与全局变量的区别。
当static用来修饰全局变量时,它就改变了全局变量的作用域。
extern 限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。
extern 外部声明, 该变量在其他地方有被定义过。
6.4 C 分析:auto:函数中的局部变量,动态地分配存储空间,数据存储在动态存储区中,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。
register:为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫"寄存器变量",只有局部自动变量和形式参数可以作为寄存器变量。
第七章变量的存储类别一、选择题1.有以下程序#include <stdio.h>int a=2;int f(int n)static int a=3;int t=0;if(n%2)static int a=4; t += a++;elsestatic int a=5; t += a++;return t+a++;void main()int s=a, i;for( i=0; i<3; i++) s+=f(i);printf("%d\n", s);程序运行后的输出结果是______。
A)26 B)28 C)29 D)24答案: C2. 凡是函数中未指定存储类别的局部变量,其默认的存储类别是。
A) auto B) register C) extern D) static答案:A3. 以下不正确的说法是。
A)在不同的函数中可以使用名称相同的变量B)在函数内定义的变量只在本函数范围内有效C)形式参数是局部变量D)在函数内的复合语句中定义的变量在本函数范围内有效答案:D4. 在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是。
A) auto B) register C) extern D) static答案:D5.如果在一个函数中的复合语句中定义了一个变量,则以下说法正确的是。
A)在本函数范围内有效B)在本程序范围内有效C)只在复合语句中有效D)非法变量答案:C6. 下列变量定义错误的是。
A) int x,y;B) register static int a,b,c;C) auto int x,y;D) extern int A;答案:B7. 以下程序的正确运行结果是_____________。
#include <stdio.h>int m=1;int n=5;int min(int a,int b);void main( )int m=100,n=10,t;t=min(m,n);printf ("%d\n", t);int min(int a,int b)int c;c=(a<=b)? a:b;return(c);A) 1 B) 5 C) 10 D) 0答案:C8. 以下程序的正确运行结果是_____________。
第七章变量的存储类别一、选择题1.有以下程序#include <stdio.h>int a=2;int f(int n)static int a=3;int t=0;if(n%2)static int a=4; t += a++;elsestatic int a=5; t += a++;return t+a++;void main()int s=a, i;for( i=0; i<3; i++) s+=f(i);printf("%d\n", s);程序运行后的输出结果是______。
A)26 B)28 C)29 D)24答案: C2. 凡是函数中未指定存储类别的局部变量,其默认的存储类别是。
A) auto B) register C) extern D) static答案:A3. 以下不正确的说法是。
A)在不同的函数中可以使用名称相同的变量B)在函数内定义的变量只在本函数范围内有效C)形式参数是局部变量D)在函数内的复合语句中定义的变量在本函数范围内有效答案:D4. 在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是。
A) auto B) register C) extern D) static答案:D5.如果在一个函数中的复合语句中定义了一个变量,则以下说法正确的是。
A)在本函数范围内有效B)在本程序范围内有效C)只在复合语句中有效D)非法变量答案:C6. 下列变量定义错误的是。
A) int x,y;B) register static int a,b,c;C) auto int x,y;D) extern int A;答案:B7. 以下程序的正确运行结果是_____________。
#include <stdio.h>int m=1;int n=5;int min(int a,int b);void main( )int m=100,n=10,t;t=min(m,n);printf ("%d\n", t);int min(int a,int b)int c;c=(a<=b)? a:b;return(c);A) 1 B) 5 C) 10 D) 0答案:C8. 以下程序的正确运行结果是_____________。
#include <stdio.h>void main( )int m=1,n=2,t=3;++m;t+=++n;int n=10,t;t=n*2;m+=t;printf("%d,%d,%d\n",m,n,t);printf("%d,%d,%d\n",m,n,t);A) 22,11,5 B)22,10,2018,5,6 22,3,6C) 32,9,5 D) 16,21,610,10,20 22,3,9答案:B9.以下叙述中正确的是。
(A)全局变量的作用域一定比局部变量的作用域范围大(B)静态(static)类别变量的生存期贯穿于整个程序的运行期间(C)函数的形参都属于全局变量(D)未在定义语句中赋初值的auto变量和static变量的初值都是随机值答案:B10.下面程序的输出是。
#include <stdio.h>int fun3 (int x)static int a=3;a+=x;return(a);void main( )int k=2,m=1,n;n=fun3(k);n=fun3(m);printf("%d\n",n);(A)3 (B)4 (C)6 (D)9答案:C11.有以下程序#include <stdio.h>int a=2;int f(int *a)return(*a)++;void main( )int s=0;int a=5;s+=f(&a);s+=f(&a);printf("%d\n",s);执行后输出结果是。
(A)10 (B)9 (C)7 (D)8答案:C12.以下只有在使用时才为该类型变量分配内存的存储类说明是。
(A)auto和static (B)auto和register(C)register和static (D)extern和register 答案:B13.下面叙述中正确的是。
A)全局变量的作用域一定比局部变量的作用域范围大B)静态(static)类别变量的生存期贯穿于整个程序的运行期间C)函数的形参都属于全局变量D)未在定义语句中赋初值的auto变量和static变量的初值都是随机值答案:B14.在C语言中,形参的缺省存储类型是。
A)auto B)register C)static D)extern答案:A15.下面程序运行后的输出结果是。
#include <stdio.h>int f()static int i=0;int s=1;s+=i;i++;return s;void main( )int i,a=0;for(i=0;i<5;i++)a+=f( );printf("%d\n",a);A)20 B)24 C)25 D)15答案:D16. 以下程序:#include <stdio.h>void main( )int i=1,j=3;printf("%d,",i++);int i=0;i+=j*2;printf("%d,%d,", i ,j);printf("%d,%d\n", i ,j);其输出结果是A)1,6,3,1,3 B)1,6,3,2,3 C)1,6,3,6,3 D)1,7,3,2,3答案:B)17. 以下程序:#include <stdio.h>void fun (int *s)static int j=0;dos[j]+=s[j+1];while (++j<2);void main( )int k, a[10]={1,2,3,4,5};for (k=1;k<3;k++) fun(a);for(k=0;k<5;k++) printf("%d",a[k]);其输出结果是A)34756 B)23445 C)35745 D)12345答案:C)18. 以下程序的输出结果是。
#include <stdio.h>int a=1;int fun(int k)static int a=5;a+=k; printf("%d ",a);return(a);void main( )int b=3;printf("%d\n",fun(b+fun(a)));(A)6 9 9 (B)6 6 9 (C)6 15 15 (D)6 6 15答案:C19. 下列程序的输出结果为。
#include <stdio.h>int c=6;void test(int *x, int y)*x=3* (*x);y=*x+y;c=y%(*x);printf ("x=%d,y=%d,c=%d\n",*x,y,c);void main ( )int a=1,b=4;test(&a,b);printf ("a=%d,b=%d,c=%d\n",a,b,c);(A)x=1,y=7,c=3 (B)x=3,y=7,c=1a=3,b=4,c=1 a=4,b=3,c=1(C)x=3,y=7,c=1 (D)x=3,y=4,c=1a=3,b=4,c=1 a=3,b=7,c=1答案:C20. 以下程序的运行结果是。
#include <stdio.h>int d=1;void fun (int p)int d=5;d+=p++;printf ("%d ",d);void main ( )int a=3;fun(a);d+=a++;printf ("%d\n",d);A)5 3 B)8 4 C)5 8 D)5 4答案:B二、填空题1.只有在函数内才能使用的变量称为_【_1_】_变量。
答案:【1】内部或局部2.主函数也_【_1_】_使用其它函数中定义的局部变量。
答案:【1】不能3.不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。
此说法正确吗?_【_1_】_。
答案:【1】正确4.在所有函数之外定义的变量称为_【_1_】_变量。
答案:【1】外部或全局5.设全局变量的作用是:增加了_【_1_】_间数据联系的渠道。
答案:【1】函数6.全局变量可以为其它函数所共用,它的有效范围为:从_【_1_】_的位置开始到文件结束。
答案:【1】定义7.建议不在必要时不要使用全局变量,因为它使函数的_【_1_】_降低了。
答案:【1】通用性或可靠性8.外部变量的定义只能有_【_1_】_次,而外部变量的说明可以有_【_2_】_次。
答案:【1】一;【2】多9.对外部变量的初始化只能在_【_1_】_时进行。
答案:【1】定义10.如果在局部变量的作用范围内与外部变量同名,则_【_1_】_变量不起作用。
答案:【1】外部11.从变量的_【_1_】_(即从空间)角度来分,可以分为全局变量和局部变量。
答案:【1】作用域12.从变量值存在的时间(即_【_1_】_)角度来分,可以分为静态存储变量和动态存储变量。
答案:【1】生存期13.在C语言中每一个变量和函数有两个属性:_【_1_】_和数据的存储类别。
答案:【1】数据类型14.存储类别指的是数据在_【_1_】_中的存储方法。
答案:【1】内存15.在C语言中,存储方法分为两大类:静态存储类和动态存储类,具体包含四种:自动的、_【_1_】_、静态的、_【_2_】_。
前两种属于动态存储类,后两种属于静态存储类。
答案:【1】寄存器的;【2】外部的16.静态存储是整个程序运行时间都存在,而动态存储则是在调用函数时临时分配单元。
所以,形式参数属于_【_1_】_存储类。
答案:【1】动态17.自动变量、寄存器变量、形式参数都属于局部变量,在离开函数时,其值_【_1_】_,而静态局部变量在离开函数时,其值_【_2_】_。
答案:【1】就消失;【2】仍保留18.如果需要保留函数上一次调用结束时的值,或变量初始化后只被引用而不改变其值,则这时采用_【_1_】_变量比较方便,以免每次调用时重新赋值。
答案:【1】静态19.如不必要,不要多用静态局部变量。
不仅长期占用内存不释放,浪费空间,而且当调用次数多时往往弄不清其当前值是什么,降低了程序的_【_1_】_。