变量的存储类别题库
第七章变量的存储类别
一、选择题
1.有以下程序
#include
int a=2;
int f(int n)
{
static int a=3;
int t=0;
if(n%2)
{
static int a=4; t += a++;
}
else
{
static 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);
}
程序运行后的输出结果是______。
)26 B)28 C)29 D)24 答案: C
2. 凡是函数中未指定存储类别的局部变量,其默认的存储类别是。A) auto B) register C) extern D) static
答案:A
3. 以下不正确的说法是。
A)在不同的函数中可以使用名称相同的变量
B)在函数内定义的变量只在本函数范围内有效
C)形式参数是局部变量
D)在函数内的复合语句中定义的变量在本函数范围内有效
答案:D
4. 在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是。
A) auto B) register C) extern D) static
答案:D
5.如果在一个函数中的复合语句中定义了一个变量,则以下说法正确的是。A)在本函数范围内有效
B)在本程序范围内有效
C)只在复合语句中有效
D)非法变量
答案:C
6. 下列变量定义错误的是。
A) int x,y;
B) register static int a,b,c;
C) auto int x,y;
D) extern int A;
答案:B
7. 以下程序的正确运行结果是_____________。
#include
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
答案:C
8. 以下程序的正确运行结果是_____________。
#include
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,20
18,5,6 22,3,6
C) 32,9,5 D) 16,21,6
10,10,20 22,3,9
答案:B
9.以下叙述中正确的是。
(A)全局变量的作用域一定比局部变量的作用域范围大
(B)静态(static)类别变量的生存期贯穿于整个程序的运行期间
(C)函数的形参都属于全局变量
(D)未在定义语句中赋初值的auto变量和static变量的初值都是随机值答案:B
10.下面程序的输出是。
#include
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
答案:C
11.有以下程序
#include
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
答案:C
12.以下只有在使用时才为该类型变量分配内存的存储类说明是。
(A)auto和static (B)auto和register
(C)register和static (D)extern和register 答案:B
13.下面叙述中正确的是。
A)全局变量的作用域一定比局部变量的作用域范围大
B)静态(static)类别变量的生存期贯穿于整个程序的运行期间
C)函数的形参都属于全局变量
D)未在定义语句中赋初值的auto变量和static变量的初值都是随机值答案:B
14.在C语言中,形参的缺省存储类型是。
A)auto B)register C)static D)extern
答案:A
15.下面程序运行后的输出结果是。
#include
int f()
{
static int i=0;
int s=1;
s+=i;i++;
return s;
}
{
int i,a=0;
for(i=0;i<5;i++)
a+=f( );
printf("%d\n",a);
}
A)20 B)24 C)25 D)15
答案:D
16. 以下程序:
#include
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
void fun (int *s)
{
static int j=0;
do
s[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
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 答案:C
19. 下列程序的输出结果为。
#include
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=1
a=3,b=4,c=1 a=4,b=3,c=1
(C)x=3,y=7,c=1 (D)x=3,y=4,c=1
a=3,b=4,c=1 a=3,b=7,c=1
答案:C
20. 以下程序的运行结果是。
#include
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_】_。
答案:【1】可读性
20.对自动变量如果不赋初值,则它的值是一个_【_1_】_值。
答案:【1】不确定的
21.对静态变量和外部变量是在编译时赋初值的,即只赋初值一次。如果在定义时不赋初值的话,则系统自动对数值型变量赋初值_【_1_】_或对字符型变量赋初值_【_2_】_。
答案:【1】0;【2】'\0'
22.全局变量包括外部变量和静态外部变量,两者的区别是:_【_1_】_变量只限于本文件引用,而_【_2_】_变量允许其它文件引用。
答案:【1】静态外部;【2】外部
23.函数本质上是全局的,因为一个函数要被另外的函数调用,但是,根据函数能否被其它源文件调用,将函数区分为_【_1_】_函数和_【_2_】_函数。
答案:【1】内部;【2】外部
24.如果在定义函数时省略关键字_【_1_】_,则隐含为外部函数。
答案:【1】extern
25.在定义内部函数时,需在函数类型前面加上关键字_【_1_】_。
答案:【1】static
26. 以下程序的正确运行结果是_____________。
#include
int f(int a);
void main()
{
int a=2,k;
for(k=0;k<3;k++) printf("%d", f (a));
}
int f(int a)
{
int b=0; static int c=3;
b++; c++;
return (a+b+c);
}
答案:789
27. 以下程序的正确运行结果是_____________。
#include
int a=4,b=6;
int max(int a,int b)
{
int c;
c=a>b?a:b;
return(c);
}
void main()
{
int a=8;
printf("%d\n",max(a,b));
}
答案:8
28. 以下程序的正确运行结果是_____________。
#include
int f(int a)
{
auto int b=0;
static c=2;
b++;
c++;
return(a+b+c);
}
void main()
{
int a=1,n;
for(n=0;n<=2;n++)
printf("%d",f(a));
}
答案:567
29. 以下程序的正确运行结果是_____________。
#include
int n=1;
void f();
void main( )
{
static int x=10;
int y;
y=n;
f();
printf ("main:%d,%d,%d\n", x,y,n);
}
void f()
{
static int x=5;
int y=4;
x=x+1;
n=n+10;
y=y+n;
printf ("f:%d,%d,%d\n", x,y,n);
}
答案:
f:6,15,11
main:10,1,11
30. 以下程序的正确运行结果是_____________。
#include
int m=1;
int n=2;
int mul(int a,int b);
void main( )
{
int m=5,n=10,s;
s=mul(m,n);
printf ("m+n=%d\n", s);
}
int mul(int a,int b)
{
int c;
c=a*b;
return(c);
}
答案:m+n=50
31.下列程序的输出结果为
#include
int a=0,b=0;
void fun( )
{
int a=5;
printf("%d,%d",a,b);
}
void main( )
{
b=5;
fun( );
printf("%d,%d\n",a,b);
}
答案:5,50,5
32.以下程序的输出结果是。
#include
int fun(int x,int y)
{
static int m=0,i=2;
i+=m+1;m=i+x+y;
return m;
}
void main( )
{
int j=4,m=1,k;
k=fun(j,m);printf("%d,",k);
k=fun(j,m);printf("%d\n",k);
}
答案:8,17
33.以下程序的执行结果是。
#include
void func(int a);
void main( )
{
int k=4; func(k); func(k);
}
void func(int a)
{
static int m=0;
m+=a;
printf("x=%d,",m);
}
答案:x=4, x=8,
34.下面程序运行后的输出结果是。
#include
int x=3;
void incre( );
void main( )
{
int i;
for(i=1;i } void incre( ) { static int x=1; x*=x+1; printf("%d",x); } 答案:26 35. 以下程序的输出结果是。 #include void main( ) { int a=3,b=2,c=1; c-=++b; b*=a+c; { int b=5, c=12; c/=b*2; a -=c; printf("%d,%d,%d,",a,b,c); a += --c; } printf("%d,%d,%d\n",a,b,c); } 答案:2,5,1,2,3,-2 36. 要使一个局部变量在两次函数调用中保持其值,必须说明成是存储类型的。答案:Static 37. 以下程序的运行结果为。 #include void as(); void main ( ) { int i; for (i=0;i<2;i++) as ( ); } void as ( ) { int lv=0; static int sv=0; printf ("lv=%d,sv=%d",lv,sv); lv++; sv++; return; } 答案:lv=0,sv=0lv=0,sv=1 三、编程题 1.编写程序,统计从键盘上输入的字符包含的单词数,单词之间用空格分隔。 【要求】 ①分析题意,建立数据模型,设计算法。 ②编程 答案: #include main() {char arrstr[100],ch1,ch2=' '; int i,num; i=0; num=0; gets(arrstr); while(arrstr[i]!='\0') {ch1=arrstr[i]; if(i==0) ch2=' '; else ch2=arrstr[i-1]; if(ch1!=' '&&ch2==' ') num++; i++; } printf("There are %d words.\n",num); } 2.编写程序。将二维数组的行列互换后存到另一个二维数组中。 【要求】 ①分析题意,建立数据模型,设计算法。 ②编程 答案: main() {int arr1[2][3]={{1,2,3},{4,5,6}}; int arr2[3][2],i,j; printf("arr1:\n"); for(i=0;i<=1;i++) {for(j=0;j<=2;j++) {printf("%6d",arr1[i][j]); arr2[j][i]=arr1[i][j]; } printf("\n"); } printf("arr1:\n"); for (i=0;i<=2;i++) {for(j=0;j<=1;j++) printf("%6d",arr2[i][j]); printf("\n"); } } 3.编写程序。输出两个数值中较大者。 (1)自定义函数max(x,y),返回值为x,y中较大者。 【要求】 ①分析题意,建立数据模型,设计算法。 ②编程 (2)在主函数main中输出。 【要求】 ①分析题意,建立数据模型,设计算法。 ②编程 答案: int y=5; main() {int x=10; printf("%d",max(x,y)); } max(x,y) {int z; z=x>y? x:y; return(z); } 4.编写程序。计算英文句子中最长单词包含的字符数。(该句中只包含字符和空格,各单词间以空格作为分隔符,句子以“.”作为结束符。) 【要求】 ①分析题意,建立数据模型,设计算法。 ②编程 答案: #include main() { char *p,s[]={"I am a student."}; int max=0,lens=0; p=s; while(*p!='.') {while(((*p<='z') && (*p>='a'))||((*p<='Z') && (*p>='A'))) {lens++; p++;} if (lens>max) max=lens; lens=0; p++;} printf("max=%d",max); } 5.编写程序。给出年、月、日,计算该日是该年的第几天。要求年、月、日在主函数main 中输入,计算该日是该年的第几天的工作在函数getdays中完成。 【要求】 ①分析题意,建立数据模型,设计算法。 ②编程 答案: unsigned months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; main() { int year,month,day,days; printf("请输入年月日:"); scanf("%u%u%u",&year,&month,&day); if ((year%4==0&&year%100!=0)||(year%400)==0) months[2]=29; days= getdays(month,day); printf("%d年%d月%d日是该年的第%d天。\n",year,month,day,days); } int getdays(int month,int day) { unsigned days=0,i; for(i=1;i days+=months[i]; days+=day; return days; } 第7章常量、变量及存储器类型 7.1 常量 常量是在程序执行过程中其值不能改变的量。常量的数据类型有整型、浮点型、字符型和字符串型等,C51编译器还扩充了一种位(bit)标量。 7.2 在51 MCU DEMO试验板上实现乘法运算:两个乘数分别为常量与变量,其积在数码管上显示(最大显示到50)。 7.2.1 实现方法 先宏定义CONST为常量2,然后定义1个无符号字符型变量x并赋初值1,再定义1个无符号整型变量y用于存放结果,使x的值与CONST相乘,其积存于y中。然后将y的内容送试验板上右侧2个LED数码管进行显示。每0.5秒后x 的值加1,直到26为止。 7.2.2 源程序文件 在D盘建立一个文件目录(CS7-1),然后建立CS7-1.uv2的工程项目,最后建立源程序文件(CS7-1.c)。输入下面的程序: #include /*=====================4===============*/ void delay(unsigned int k) //5 { //6 unsigned int i,j; //7 for(i=0;i 变量的作用域与存储类别(变量的作用域——变量的生存期) 变量的作用域 ——局部变量和全局变量 变量的生存期 ——静态存储类别和动态存储类别(注意区别存储类型和函数类型) 变量的作用域 一、局部变量 定义:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。 二、全局变量 定义:在函数之外定义的变量称为外部变量,或全局变量。它可为本文件中其他函数所共用。有效范围为从定义变量的位置开始到本源文件结束。 注意: 全局变量在程序的全部执行过程中都占有存储单元,而不是仅在需要时才开辟单元。 它使函数的通用性降低,因函数在执行时要依赖于其所在的外部变量。 降低了程序的清晰性。 在同名局部变量作用的范围内,外部变量被“屏蔽”。 变量的生存期 一、动态存储方式与静态存储方式 静态存储:在程序运行期间分配固定的存储空间的方式。 动态存储:在程序运行期间根据需要进行动态的分配存储空间的方式。 静态存储区:存储空间的分配在编译阶段进行,且存于其中的数据对象相对于程序的执行是永久的。 动态存储区:存储空间的分配是在程序的运行过程中进行的。 二、auto变量 调用函数时系统自动分配存储空间,在函数调用结束时自动释放这些存储空间,称这类局部变量为自动变量。 用关键字auto作存储类别的声明。它也可省。 三、用static声明局部变量 静态的 局部的 说明: 静态局部变量属于静态存储类别,在静态存储区内分配单元。在程序整个运行期都不释放。 自动变量属于动态存储类别,在动态存储区内分配单元,函数调用结束后即释放。 静态局部变量在编译时赋初值,以后每次函数调用时不再重新赋初值 ... .......而只是保留上次函 数调用结束时 ......的值。 自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值。 静态局部变量,如不赋初值,编译时自动赋初值0 或空字符。 自动变量,如不赋初值,它的值是一个不确定的值。 虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用。 一般在下列情况时,使用局部静态变量: 1、需要保留函数上一次调用结束时的值时; 2、如果初始化后,变量只被引用而不改变其值时。 四、register变量 说明: 1、只有局部自动变量和形参可作为register变量。 2、不能定义任意多个寄存器变量。 3、局部静态变量不能定义为寄存器变量。 五、用extern声明外部变量 在一个文件内声明外部变量 例:main( ) { extern A; /*外部变量声明*/ printf(“%d”,A); } 1.存储类型和数据类型。存储类型是针对变量而言的,它规定了变量的存储位置,从而也确认了其作用域和生存期;数据类型也可以针对变量,它规定了变量所占内存空间的大小。 2.C中只有两种存储类型:自动类和静态类。全局变量只能是静态类,而局部变量可以任意。 3.说明变量存储类型的格式:<存储类型> <数据类型> <变量名表>;(存储/数据类型可以交换次序),与存储类别有关的说明符:auto(自动),static(静态),register(寄存器),extern (外部)。 4.计算机内存分三部分:动态存储区(堆栈)、静态存储区、程序代码区。动态存储区用来保存函数调用时的返回地址、自动类别的局部变量等;静态存储区用以存放全局变量及静态类别的局部变量;程序代码区存放各类代码。 5.C++中,可以用static说明"静态函数",其不允许嵌套定义,也不允许外部编译单元中的函数对它进行调用。 ******************************************************************************/ #include 对变量的说明包括:数据类型,存储类型,作用域。 第二讲主要是讲数据类型 数据类型:基本数据类型(包括常量和变量),构造数据类型(包括数组类型,结构类型,联合类型),指针类型,空类型(其类型说明符为void)四大类。 整形量包括:整形常量,整型变量。整形常量就是整常熟。使用的整常数有八进制,十进制,十六进制三种。其中八进制整常数必须以0开头。1、八进制整常数是无符号数。2、十六进制整形数前缀0或者是0X。基本整型的长度也为16位,因此表示的数的范围也是有限定的。十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。八进制无符号数的表示范围为0~0177777。十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。长整数158L和基本整常数158 在数值上并无区别。但对158L,因为是长整型量,C编译系统将为它分配4个字节存储空间。而对158,因为是基本整型,只分配2 个字节的存储空间。因此在运算和输出格式上要予以注意,避免出错。无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。例如:358u,0x38Au,235Lu 均为无符号数 整型变量 整型变量可分为以下几类: 1.基本型 类型说明符为int,在内存中占2个字节,其取值为基本整常数。 2.短整量 类型说明符为short int或short'C110F1。所占字节和取值范围均与基本型相同。 3.长整型 类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。 4.无符号型 类型说明符为unsigned。 无符号型又可与上述三种类型匹配而构成: (1)无符号基本型类型说明符为unsigned int或unsigned。 (2)无符号短整型类型说明符为unsigned short (3)无符号长整型类型说明符为unsigned long 各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。下表列出了Turbo C中各类整型量所分配的内存字节数及数的表示范围。 类型说明符数的范围分配字节数 int -32768~32767 ■■ short int -32768~32767 ■■ signed int -32768~32767 ■■ unsigned int 0~65535 ■■ long int -2147483648~2147483647■■■■ unsigned long 0~4294967295 ■■■■ 在书写变量说明时,应注意以下几点: 1.允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。 2.最后一个变量名之后必须以“;”号结尾。 3.变量说明必须放在变量使用之前。一般放在函数体的开头部分。 实型量 实型常量:1、十进制形式2、指数形式,实型常量(double)不分单、双精度,都按双精度 首先要来理解一下可执行文件加载进内存后形成的进程在内存中的结构,如下图: 代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的。 数据区:存放已初始化的全局变量、静态变量(全局和局部)、常量数据。 BBS区:存放的是未初始化的全局变量和静态变量。 栈区:由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须程序员手动管理。 堆区:堆是由malloc()函数分配的内存块,使用free()函数来释放内存,堆的申请释放工作由程序员控制,容易产生内存泄漏。 c语言中的存储类型有auto, extern, register, static 这四种,存储类型说明了该变量要在进程的哪一个段中分配内存空间,可以为变量分配内存存储空间的有数据区、BBS区、栈区、堆区。下面来一一举例看一下这几个存储类型: 1. auto存储类型 auto只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中。示例如下: [cpp]view plaincopy 1#include 一、数据类型 基本类型:int、char、int、float、double 构造类型:数组(一维数组、二维数组、指针数组、函数指针数组、结构体数组……)、结构体、共用体 指针:一维指针、二维指针、数组指针、函数指针、结构体指针 空类型:void,该类型也叫缺省型,用于描述值为空集,主要用于说明不返回值的函数或指向任一类型的指针等 1、32位计算机,各种数据类型所占字节数是: char = 1;short = 2;int = 4;long = 4;float = 4;double = 8(实型数据的存储方式不同于其他基本数据类型) 2、bool类型 bool类型数据的值,是真或者非真,-即:0/1(非0即为真) 定义时需加上:#include C语言变量的存储类别 内存中供用户使用的存储空间分为代码区与数据区两个部分。变量存储在数据区,数据区又可分为静态存储区与动态存储区。 静态存储是指在程序运行期间给变量分配固定存储空间的方式。如全局变量存放在静态存储区中,程序运行时分配空间,程序运行完释放。 动态存储是指在程序运行时根据实际需要动态分配存储空间的方式。如形式参数存放在动态存储区中,在函数调用时分配空间,调用完成释放。 对于静态存储方式的变量可在编译时初始化,默认初值为O或空字符。对动态存储方式的变量如不赋初值,则它的值是一个不确定的值。 在C语言中,具体的存储类别有自动(auto)、寄存器(register)、静态(static)及外部(extern)四种。静态存储类别与外部存储类别变量存放在静态存储区,自动存储类别变量存放在动态存储区,寄存器存储类别直接送寄存器。 变量存储类别定义方法: 存储类别类型变量表; 例如: (1)a,b,c为整型自动存储类别变量: auto int a,b,c; (2)x,y,z为双精度型静态存储类别变量: static double x,y,z; 1、变量有哪些存储类型? 变量的存储类型由“存储类型指明符”来说明。存储类型指明符可以是下列类键字之一: auto register extern static 下面是详细的解释: auto 存储类指明符--用于说明具有局部作用域的变量,它表示变量具有局部(自动)生成期,但由于它是所有局部作用域变量说明的缺省存储类指明符,所以使用得很少。要注意的是,所有在函数内部定义的变量都是局部变量,函数内部定义的变量其作用域只在函数内部。它的生存期为该函数运行期间,一旦离开这个函数或这个函数终止,局部变量也随之消失。 register 存储类指明符--当声明了这个指明符后,编译程序将尽可能地为该变量分配CPU内部的寄存器作为变量的存储单元,以加快运行速度。注意,寄存器与存储器是不同的。寄存器一般在CPU内部,而存储器一般指外部的(比如内存条),CPU内部的寄存器其运算速度是很高的。当寄存器已分配完毕,就自动地分配一个外部的内存。它的作用等价于auto,也只能用于局部变量和函数的参量说明。 static 存储类指明符--表示变量具有静态生成期。static变量的的特点是它离开了其作用域后,其值不会消失。 当回到该作用域之后又可以继续使用这个static变量的值。 例:利用static变量统计调用函数的次数 int two(); /*函数原型说明*/ void main() { int a=0; a=two(); /*a的值等于1*/ a=two() /*a的值等于2*/ a=two(); /*a的值等于3*/ } int two() { static int b=0;/*定义了一个局部的static变量*/ b ; return b; 《标准C语言程序设计》上机报告 实验四变量存储类型的理解和使用 以及数组初步 专业:通信工程 班级:通信 学号:U201 姓名: 完成日期:2011.5.1 1 一、实验目的 1.熟悉变量的各种存储类型的定义和申明 2.理解各种存储类型变量的作用域和生存期; 3.掌握局部变量和全局变量; 4.掌握动态存储和静态存储; 5.掌握一维数组和二维数组的定义、初始化和数组元素的引用; 6.理解并掌握数组名和数组下标的含义; 7.与数组有关的算法初步(排序) 8.掌握C开发环境中调试、跟踪数组元素取值和元素空间地址的使用 二、实验内容及要求 1.上机调试跟踪复合语句中的同名变量,掌握理解复合语句中局部变量的作用 域以及变量存储空间的生存期。写出你对同名变量使用的深入理解。 2.上机运行下面程序,调试跟踪static变量a和其它存储类型变量b、c的取值 变化,加深理解不同存储类型变量的作用域和生存期语法概念,并给出你对静态局部和自动变量这两种局部作用域存储类型的深入理解。 3.教材习题四的第三题,给出运行结果,单步跟踪了解调试器对函数内部auto 和static两种局部变量x和y的附带初值的定义语句执行过程有何区别?进一步深入理解两种局部变量auto、static的区别。 4.理解符号常量的作用域。 5.调试课堂下面代码了解下标越界问题. #include 第七章变量的存储类别 一、选择题 1.有以下程序 #include A) auto B) register C) extern D) static 答案:A 3. 以下不正确的说法是。 A)在不同的函数中可以使用名称相同的变量 B)在函数内定义的变量只在本函数范围内有效 C)形式参数是局部变量 D)在函数内的复合语句中定义的变量在本函数范围内有效 答案:D 4. 在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是。 A) auto B) register C) extern D) static 答案:D 5.如果在一个函数中的复合语句中定义了一个变量,则以下说法正确的是。 A)在本函数范围内有效 B)在本程序范围内有效 C)只在复合语句中有效 D)非法变量 答案:C 6. 下列变量定义错误的是。 A) int x,y; B) register static int a,b,c; .51 的存储器结构 笼统来说单片机片内存储器分为CODE区和data区,cpu从code区读取指令,对data 区的数据进行运算处理。前者在程序运行中为只读,一般为FLASH,用来放置程序代码和一些只读的数据(如字模表之类),后者可以随机读写,用来存放程序运行中的临时数据,如局部变量或全局变量,全局变量一直占用着RAM内存,而局部变量在使用完后会自动清除RAM空间。当然在片外,可以外扩FLASH和RA(此时称为XRAM因为寻址方式不一样),外扩的大小与单片机寻址能力有关。有的单片机将外扩RAM封装在片内,如AT89C51所以有了所谓的片内XRAM。 .变量的存储模式 变量是一种在程序执行过程中能不断变化的量。它有数据类型、存储类型、存储器模式和有效范围四种属性。C语言规定每个变量必须有一个标识符作为变量名,在使用一个变量前,必须先对变量进行定义,指出其数据类型和存储模式。以便编译系统为其分配存储单元。在C51中对变量进行定义的格式如下: [ 存储类型] 数据类型[ 存储器类型] 变量名表, 如auto char data i; 存储类型指明变量的存储区域,而变量的存储类型和变量在程序中说明的位置决定了它的作用范围。存储类型含义与C语言相同。存储类型有四种:auto型、extern 型、static 型、register 型,缺省为auto型(看来我一直都是凹凸型啊)。其区别如下: auto:自动变量。存储在内存的堆栈区,属于临时性存储变量,并不长期占用内存,可以被多次覆盖。 register:寄存器变量。register与auto一样属于自动类别。区别在于register 的值保存在CPU 的寄存器中。计算机中只有寄存器中的数据才能直接参与运算,而一般变量是放在内存中的,变量参加运算是,需要先把变量从内存中取到寄存器中,然后计算。所以一般把使用最频繁的变量定义成register变量。register变 量只能在函数中定义,并只能是int和char型。 static:静态变量。声明静态变量的,也就是C语言中的私有成员?如果在一个函数中声明一个静态变量,静态变量的空间不在栈里面,而是存储在静态空间里,这个函数结束后,静态变量的值依旧存在,内存不会收会此变量占用的内存空间,而是等整个程序都结果后才收回静态 变量空间。 extern:外部类型。extern用来声明外部变量,可以用于此程序外的程序中(可在两个C 文件间交叉使用),类型要一致。变量在数据运行时被分配了一定的内存空间,该空间在整个运行程序中,只要程序存在,自始自终都被该变量使用,即其值始终不变。 数据类型就不用多说了,bit ,byte,char 什么的。 存储器类型与单片机的寻址方式有关,影响程序的执行效率。下表是传统 C51 的存储器类型,不同单片机类型有所差别。 杨振平 不同的变量所分配的存储区域也不同,这就是变量的存储类型。 (1)C++ 程序运行时使用的内存区域堆区 栈区 全局数据区 程序代码区存放程序的各个函数的代码 存放全局数据和静态数据,如全局变量存放局部数据。如局部变量存放动态分配的数据 (2)变量的存储类型 变量的存储类型是变量在内存中存储的方式,根据变量的存储类型,可以知道变量的作用域和生存期。这里,介绍 4个存储类型,分别是auto(自动类),register(寄存器类),static(静态类)和extern(外部类)。 在c++中定义一个变量的完整形式是: <存储类型> <数据类型> <变量名>; ●自动变量-用auto 修饰(默认的定义方式)。如:定义一个局部变量i 。 auto int i; 与int i; 是相同的。 ● 寄存器变量-用register 修饰将尽可能存放在CPU 的寄存器中,以提高程序的运行效率说明:自动变量在其定义块(函数或复合语句)开始执行时分配空间,在块执行结束时释放空间。所以自动变量的生命期开始于块的执行,终止于块的结束。 注意,仅局部变量和形参可作为寄存器变量。 ●静态变量-用static修饰 静态变量分配在全局数据区中,定义时系统将提供默认的初始值。 静态变量在编译时分配存储空间,在整个程序执行结束后释放存储空间。所以,静态变量具有全局生命期。 根据声明的位置不同,静态变量又分为静态局部变量和静态全局变量。 静态局部变量是在“块”中定义的静态变量。它具有局部作用域,却有全局生命期。在“块”执行结束后,该静态局部变量并不释放(其值依旧存在),以便下次调用时可继续使用。 一、作用域和生存期 C程序的标识符作用域有三种:局部、全局、文件。标识符的作用域决定了程序中的哪些语句可以使用它,换句话说,就是标识符在程序其他部分的可见性。通常,标识符的作用域都是通过它在程序中的位置隐式说明的。 1.局部作用域 前面各个例子中的变量都是局部作用域,他们都是声明在函数内部,无法被其他函数的代码所访问。函数的形式参数的作用域也是局部的,它们的作用范围仅限于函数内部所用的语句块。 void add(int); main() { int num=5; add(num); printf(%d\n,num); /*输出5*/ } void add(int num) { num++; printf(%d\n,num); /*输出6*/ } 上面例子里的两个num变量都是局部变量,只在本身函数里可见。前面我们说了,在两个函数出现同名的变量不会互相干扰,就是这个道理。所以上面的两个输出,在主函数里仍然是5,在add()函数里输出是6。 2.全局作用域 对于具有全局作用域的变量,我们可以在程序的任何位置访问它们。当一个变量是在所有函数的外部声明,也就是在程序的开头声明,那么这个变量就是全局变量。 void add(int); int num; main() { int n=5; add(n); printf(%d\n,num); /*输出6*/ } void add(num) /*形式参数没有指定类型*/ num++; printf(%d\n,num); /*输出6*/ } 上面的main()和add()里面,并没有声明num,但是在最后输出的时候却要求输出num,这是由于在程序的开始声明了num是全局变量,也就是在所有函数里都可以使用这个变量。这时候一个函数里改变了变量的值,其他函数里的值也会出现影响。上面的例子输出都是6,因为在add()函数里改变了num的值,由于num是全局变量,就好象它们两个函数共用一个变量,所以在main()函数里的num也随之改变了。 3.文件作用域 在很多C语言书上,都没有说明文件作用域,或者只是略微的提到,其实文件作用域在较大程序中很有作用(在多文件系统中)。文件作用域是指外部标识符仅在声明它的同一个转换单元内的函数汇总可见。所谓转换单元是指定义这些变量和函数的源代码文件(包括任何通过#include指令包含的源代码文件)。static存储类型修饰符指定了变量具有文件作用域。 static int num; static void add(int); main() { scanf(%d,&num); add(num) printf(%d\n,num); } void add(num) { num++; } 上面的程序中变量num和函数add()在声明是采用了static存储类型修饰符,这使得它们具有文件作用域,仅爱定义它们的文件内可见。 由于我们提到的大多数程序都只有一个编译文件组成,所以这种写法没有实际意义。但是实际工程上的文件有很多,它们不是由一个人写成的,由很多人共同完成,这些文件都是各自编译的,这难免使得某些人使用了一样的全局变量名,那么为了以后程序中各自的变量和函数不互相干扰,就可以使用static修饰符,这样在连接到同一个程序的其他代码文件而言就是不可见的。 二、变量存储类型 前面我们说了,声明变量时用如下类似的形式: int num; float total; 从变量地生命期(即时间)角度来分,可以分为静态存储变量和动态存储变量. 所谓静态存储变量通常是在变量定义时就分配存储单元并一直保持不变,直至整个程序执行结束.全局变量即属于此类存储方式.文档收集自网络,仅用于个人学习 而动态存储变量是在程序执行过程中,使用它时才分配存储空间,使用完毕立即释放.典型地例子就是函数地形参,在函数定义时,并不给形参分配存储单元,只是在函数调用时才给予分配,调用函数完毕立即释放.如果一个函数被多次调用,则反复地分配、形参变量地存储单元.文档收集自网络,仅用于个人学习 变量地初值、作用域和生命周期受变量地定义位置(全局、局部)和存储类型(自动、静态、外部、存储器类型)地影响.文档收集自网络,仅用于个人学习 变量定义地完整形式应为:[存储类型说明符] 数据类型说明符变量名 变量地存储包括:自动型()、静态型()、外部型()、寄存器型()文档收集自网络,仅用于个人学习 自动变量()语言规定,函数内凡未加存储类型说明地变量均视为自动变量.自动变量具有以下特点:文档收集自网络,仅用于个人学习 自动变量地作用域仅局限于定义该变量地个体内.在函数中定义地自动变量,只在该函数内有效.在复合语句中定义地自动变量只在该复合语句中有效.文档收集自网络,仅用于个人学习 自动变量属于动态存储方式,只有在使用它时,即定义该变量地函数被调用时才给它分配存储单元,开始它地生命期.函数调用结束,释放存储单元,结束生命期.因此函数调用结束之后,自动变量地值不再保留.在复合语句中定义地自动变量,在退出复合语句后也不能在使用,否则将引起错误.文档收集自网络,仅用于个人学习 外部变量() 需要注意地是,外部变量地说明要应用在全局变量上.对全局变量进行外部变量说明后,可以扩大其作用域.例如,在同一程序文件中,如果全局变量地定义在后,而引用它地函数在前,只需将该变量说明为,则位置靠前地函数就会引用它.又如,当一个文件分散在几个程序文件中时,若一个程序文件中已经定义了某个全局变量,则另一个程序文件只要对该变量进行说明,而不必另行定义,就可以引用该变量,从而实现数据共享地目地.文档收集自网络,仅用于个人学习 静态变量() 静态变量属于静态存储方式,但是属于静态存储方式地不一定是静态变量.例如全局变量. 静态局部变量具有以下特点: ()静态局部变量在函数内定义,但不同于自动变量,它在整个源程序执行过程中始终存在着,也就是说它地生命期为整个源程序.文档收集自网络,仅用于个人学习 静态局部变量地生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量地函数内使用该变量.退出该函数后,尽管该变量还继续存在,但不能使用它.文档收集自网络,仅用于个人学习 允许对构造类(如数组)静态局部量赋初值,若未赋以初值,则系统自动 赋值.对于基本类型地静态局部变量,若在说明是未赋以初值,则系统自动赋予初值,自动变量()若不赋初值,则其值是不定地.文档收集自网络,仅用于个人学习 静态全局变量特点: 非静态全局变量地作用域是整个源程序,即当一个源程序由多个源文件组成时,非静态地全局变量在各个源文件中都是有效地.而静态全局变量则对其作用域作了限制,即只在定义该变量地源文件内有效,在同一源程序地其他源文件内中不能使用它.文档收集自网络,仅用于个人学习 实验11 变量的存储类别 一、实验目的 1. 掌握外部变量、内部变量、静态变量和自动变量的定义 2. 了解外部变量、内部变量、静态变量和自动变量的作用域和生存期 3. 掌握使用全局变量(数组)在函数之间和源程序之间正确传送数据 4. 熟练掌握外部变量、内部变量、静态变量和自动变量的初始化 二、实验内容 实训1输入学生的学号(数字字符串),将其转换为整型数。 实验步骤: 1) 在VS2008中新建项目,在项目中新建C++源文件,输入下面程序,并且编译、连接。 //*************************************************************** //* 程序名:实验11实训1.cpp * //* 主要功能: * //* 将数字字符串转换为整数 * //*************************************************************** #include 无论用什么语言编制的程序,都是为让计算机完成某一特定功能而编写的文本文件。这些文本文件是不能直接在机器上运行的,它们必须经过系统软件(包括编辑器和编译器)的输入并编译或汇编后,转换成二进制的可执行代码,才是计算机可以识别的机器语言。此时,程序就是一个包含二进制可执行代码文件的模块。当内核把二进制的可执行代码装入内存后,它由三部分组成:代码段、数据段、堆栈段。在线性地址的低地址字段是代码段,存放程序经编译后的可执行代码(程序文本)。在操作系统中,代码段是只读的,不能修改,所以,代码段的长度是不会改变的。在程序文本(代码段)的上方是数据段,用来存放程序的变量、字符串和其它数据。它分为初始化静态数据(data)和未初始化静态数据(BSS)。数据段的长度是可以改变的。程序可以修改其中的变量。在程序设计中,将其值可以改变的量称为变量。每一个变量在内存中都要占据一定的存储单元,因此,每一个变量也就会具有一定的存储属性。 从变量的作用域(空间)的角度来考虑变量的属性,可将变量分为全局变量和局部变量。局部变量 局部变量是指在一个函数内部定义的变量,它只中本函数范围内有效。 说明: 1、在主函数中定义的变量只在主函数中有效,且主函数也不能使用其他函数中定义的变量 2、在不同函数中可以使用相同名字的变量,它们代表不同的变量,互不干扰; 3、形参也是局部变量,也只在对应的函数中有效,其他函数不能使用 4、在一函数内部,可在复合语句(有一个{}括起的一组语句)中定义变量,这些变量只在本复合语句中有效。 全局变量 程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数之外定义的变量称为外部变量(extern),也叫全局变量。全局变量的有效范围是从定义变量的位置开始到本源程序文件结束为止,其关键字extern可以省略。 说明: 1、在一个函数中既可以使用本函数中的局部变量,又可以使用有效的全局变量。第7章 常量、变量及存储器类型
变量的作用域与存储类别&&变量的生存期——天擎国际
C语言变量存储类型
对变量的说明包括数据类型存储类型作用域
从内存理解C语言中变量的存储类型
C语言数据类型、存储类型
C语言变量的存储类别
变量存储类型的理解
变量的存储类别题库共25页word资料
单片机数据存储类型和申明方法
C++变量的存储类型
(十二)变量的作用域和存储类型
变量的存储类型AUTO、static、extern、register介绍
实验11变量的存储类别
C语言变量的声明和空间的分配