您好,欢迎访问三七文档
电算概论II崔锦花延边科学技术大学--第五章变量的储存类型2008-06-04目录变量的储存类型自动型变量静态型变量寄存器型变量外部参照型变量YBUST21.变量的储存类型可以存放数据的空间计算机的寄存器内存一般数据区堆栈区储存类型用户可以通过定义变量的储存类型来选择变量的储存地点YBUST31.变量的储存类型变量的储存类型YBUST4分类储存地址生存期适用范围auto自动型stack内存堆栈区暂时性只适用于变量定义的域内static静态型一般内存数据区永久性只适用于变量定义的域内,但在域外仍能保存其变量值register寄存器型CPU的通用寄存器暂时性只适用于变量定义的域内extern外部参照型一般内存数据区永久性适用于程序的所有文件目录变量的储存类型自动型变量静态型变量寄存器型变量外部参照型变量YBUST52.自动型变量自动型变量(automaticvariable)又称堆栈型,分配在内存的堆栈区堆栈区—stack领域储存方式--LIFO(lastinfirstout)只适用于函数内部或函数的特定域内localvariable工作原理执行:调用函数时,将在堆栈区给变量分配内存结束:结束函数时,收回分配给该变量的内存YBUST62.自动型变量堆栈区(stack)的原理--PUSHYBUST71020103020102030堆栈区领域PUSH10PUSH30PUSH20102.自动型变量堆栈区(stack)的原理--POPYBUST8201020POP2030102030POP3010POP10102.自动型变量形式(auto)数据类型变量1,变量2,…;(auto)数据类型变量1=常数1,变量2=常数2,…;特征定义在函数内部执行完后,自动消失定义自动型数组变量时,不能同时赋予初始值没有给自动型变量赋予初始值的时候,无法确认其变量值这样的状态叫garbage省略‘auto’时,程序照样识别成自动型变量利用自动型变量可以节省内存空间YBUST92.自动型变量例1YBUST10main(){autointa,b;autofloatc=3.1415;chard,e;}定义自动型变量赋予初始值省略auto也能被识别成自动型变量跳出函数域({})时,变量会自动消失2.自动型变量例2YBUST11main(){autointa[10];floatb[5];}定义整型数组a[0],a[1],…,a[9]定义省略auto的实型数组b[0],b[1],…,b[4]定义自动型变量数组时,不能同时赋予初始值YBUST12Program5.1SourceCodeResult2.自动型变量#includestdio.hmain(){inta=10;printf(“main-a=%d\n“,a);sub();printf(“main-a=%d\n”,a);}sub(){inta=20;printf(“sub-a=%d\n”,a);}main-a=10sub-a=20main-a=10YBUST13Program5.2SourceCodeResult2.自动型变量#includestdio.hmain(){inta=35;if(a10){inta=30;printf(“(1)a=%d\n”,a);}printf(“(2)a=%d\n”,a);}(1)a=30(2)a=35YBUST14Program5.4SourceCodeResult2.自动型变量#includestdio.hmain(){inta=10;intb=40;{inta=20;{inta=30;printf(“Block(3)a=%d\n”,a);printf(“Block(1)b=%d\n”,b);}printf(“Block(2)a=%d\n”,a);}printf(“Block(1)a=%d\n”,a);}Block(3)a=30Block(1)b=40Block(2)a=20Block(1)a=10目录变量的储存类型自动型变量静态型变量寄存器型变量外部参照型变量YBUST153.静态型变量静态型变量(staticvariable)分配在内存的数据区中外部静态型变量,内部静态型变量工作原理第一次调用函数时分配内存调用结束时并不回收内存,而是继续保留其中的值第二次调用函数时将不再分配内存上次调用函数结束时保留的值可以继续使用只有程序运行结束后,才释放所占用的内存形式static数据类型变量1,变量2,…;YBUST163.静态型变量例1YBUST17staticinta=10,b=20;main(){staticfloatc,d,e;}外部静态型变量内部静态型变量3.静态型变量例2YBUST18staticinta;main(){…sub()…}sub(){staticintb;…}外部静态型变量内部静态型变量YBUST19Program5.5SourceCodeResult3.静态型变量#includestdio.hmain(){staticinta=10;a=a+1;printf(“(1)a=%d\n”,a);{a=a+1;printf(“(2)a=%d\n”,a);}a=a+1;printf(“(3)a=%d\n”,a);}(1)a=11(2)a=12(3)a=13YBUST20Program5.6SourceCodeResult3.静态型变量#includestdio.hmain(){intc;printf(“staticvar.autovar.\n”);printf(“===============\n”);for(c=0;c3;c=c+1)sub();}sub(){staticinta=20;autointb=20;printf(“a=%db=%d\n”,a,b);a=a+1;b=b+1;}staticvar.autovar.=================a=20b=20a=21b=20a=22b=20YBUST21Program5.7SourceCodeResult3.静态型变量#includestdio.hstaticinta=20;sub1(){a=a+1;printf(“sub(1)a=%d\n”,a);}sub2(){a=a+1;printf(“sub(2)a=%d\n”,a);}main(){a=a+1;printf(“main()a=%d\n”,a);sub1();sub2();}main()a=21sub(1)a=22sub(2)a=23YBUST22Program5.8SourceCodeResult3.静态型变量#includestdio.hstaticinta;main(){staticintb;a=30;b=10;printf(“b=%d\n”,b);sub();}sub(){a=a+5;printf(“a=%d\n”,a);}b=10a=35目录变量的储存类型自动型变量静态型变量寄存器型变量外部参照型变量YBUST234.寄存器型变量寄存器型变量(registervariable)分配在CPU的通用寄存器中,便于高速运算数量及大小由于CPU的通用寄存器数量有限,一般最多定义1~3个如果定义数目过多,则会自动将超出的变量设为自动型变量不能定义占用字节数多的变量,如long,float,double只允许int,char,short,指针型变量内存的分配和回收与自动型变量相同形式:register数据类型变量1,变量2,…;YBUST244.寄存器型变量例YBUST25registerintr1,r2;registerr1,r2;registerchara,b;registerint*a;定义整型寄存器型变量可以省略int定义字符型寄存器型变量定义指针型(pointer)寄存器型变量YBUST26Program5.9SourceCodeResult4.寄存器型变量#includestdio.hvoidmain(){registerinta,b,c;a=20;b=30;c=a+b;printf(“a=%d\n”,a);printf(“b=%d\n”,b);printf(“c=%d\n”,c);}a=20b=30c=50YBUST27Program5.10SourceCodeResult4.寄存器型变量#includestdio.hvoidmain(){registera,b;for(a=1;a=5;a++){for(b=1;b=5;b++){if(a==3)printf(“%d*%d=%d\n”,a,b,a*b);}}}3*1=33*2=63*3=93*4=123*5=15YBUST28Program5.11SourceCodeResult4.寄存器型变量#includestdio.hvoidmain(){registerinta=10;{registera=20;{registera=30;printf(“a=%d\n”,a);}printf(“a=%d\n”,a);}printf(“a=%d\n”,a);}a=30a=20a=10YBUST29Program5.12SourceCodeResult4.寄存器型变量#includestdio.hvoidmain(){registera;int*p;p=&a;printf(“addressa=%x\n”,p);}程序有错误,不能执行程序说明:register变量不支持地址&运算目录变量的储存类型自动型变量静态型变量寄存器型变量外部参照型变量YBUST305.外部参照型变量外部参照型变量(externalvariable)工作原理和特征必须先在函数外面定义变量,后用extern表明要参照此变量一旦定义成外部参照型变量,可以在其他源程序文件参照此变量变量中的值将保留到程序结束为止形式:extern数据类型变量1,变量2,…;YBUST315.外部参照型变量例1YBUST32inta=10;main(){externinta;printf(“a=%d\n”,a);}定义外部参照型变量参照变量5.外部参照型变量例2YBUST33inta=10main(){inta=20;printf(“a=%d\n”,a);}定义外部参照型变量自动型变量(autovariable)YBUST34Program5.13SourceCodeResult5.外部参照型变量#includestdio.hinti=100;voidmain(){externinti;printf(“i=%d\n”,i);{inti=200;printf(“i=%d\n”,i);}sub();printf(“i=%d\n”,i);}sub(){externinti;i=i+1;}i=100i=200i=101YBUST35Program5.14SourceCodeResult5.外部参照型变量#includestdio.hinti=100;voidmain(){printf(“i+b=%d\n”,i+b);}intb=200;undefine이라는에러메시지를나타낸다YBUST36Program5.15SourceCodeResult5.外部参照型变量#includestdio.hintx=150;inty=300;voidmain(){printf(“x+y=%d\n”,x+y);}x+y=450YBUST37Program5.16SourceCodeResult5.外部参照型变量#includestdio.hinta=100;voidmain(){externa;ext
本文标题:变量的储存类型
链接地址:https://www.777doc.com/doc-3587632 .html