第12章 存儲(chǔ)類型與類型界限符_第1頁
第12章 存儲(chǔ)類型與類型界限符_第2頁
第12章 存儲(chǔ)類型與類型界限符_第3頁
第12章 存儲(chǔ)類型與類型界限符_第4頁
第12章 存儲(chǔ)類型與類型界限符_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第12章存儲(chǔ)類型與類型限定符學(xué)習(xí)目標(biāo)〔1〕理解存儲(chǔ)類型的根本概念及類別?!?〕掌握extern、register、static和const等類型限定符的使用方法。在C語言中,每一個(gè)變量和函數(shù)都有兩個(gè)屬性:類型〔type〕和存儲(chǔ)類型〔storageclass〕,其中類型決定了為變量和函數(shù)分配多大的存儲(chǔ)單元,而存儲(chǔ)類型確定了所聲明對象的生存期。生存期也稱為存儲(chǔ)期間,它是指對象保持所分配的存儲(chǔ)單元的時(shí)間。存儲(chǔ)類型有4種,分別是自動(dòng)、外部、存放器和靜態(tài),對應(yīng)的關(guān)鍵字分別是:autoexternregisterstatic前面所涉及到變量,聲明時(shí)都沒有明顯地指明存儲(chǔ)類型,這種缺省的存儲(chǔ)類型是自動(dòng)的。如以下明顯地指定存儲(chǔ)類型的聲明autointa,b;autofloatx,y;{

inta=12,b=23;floatx=5.6,y=16.4;

……}進(jìn)入塊時(shí),為變量a、b、x和y分配存儲(chǔ)單元a12b23x5.6y16.4退出塊時(shí),釋放分配給變量a、b、x和y的存儲(chǔ)單元abxy

等價(jià)于以下缺省存儲(chǔ)類型的聲明inta,b;floatx,y;

12.2存儲(chǔ)類型extern這種變量只要在函數(shù)和塊之外聲明后,它能在函數(shù)或塊的內(nèi)外都保持分配給它的存儲(chǔ)單元,從而保持其值。#include<stdio.h>floatpi=3.14159;inta=1,b=2,c=3;intf(void);intmain(void){printf("%3d\n",f());printf("%3d%3d%3d\n",a,b,c);return0;}intf(void){intb,c;a=b=c=4;return(a+b+c);}外部變量定義時(shí)不需要使用extern在定義聲明外部變量時(shí),無需使用存儲(chǔ)類型符extern,且一般包括有初始化。但是并不是意味著任何時(shí)候都可以省略存儲(chǔ)類型符extern。在定義這種外部變量的文件之外的其他文件中使用它時(shí),需要用存儲(chǔ)類型符extern聲明。

外部變量也稱為是全局變量。作用域是從定義的地方開始到程序結(jié)束。注意:floatarea_circle(floatr,float*S){

externfloatpi;if(r>0){*S=r*r*pi;return1;}elsereturn0;}例,在另一個(gè)文件中函數(shù)area_circle()需要訪問前述文件中定義的外部變量pi,那么訪問前需要用存儲(chǔ)類型符extern聲明pi。所有的函數(shù)的存儲(chǔ)類型都具有外部存儲(chǔ)類型,在函數(shù)體中和函數(shù)原型中都可以使用關(guān)鍵字extern。例如,externfloatarea_circle(float,float*);……externfloatarea_circle(floatr,float*S){externfloatpi;if(r>0){*S=r*r*pi;return1;}elsereturn0;}12.3存儲(chǔ)類型register

變量與存儲(chǔ)單元關(guān)聯(lián),一個(gè)變量具有一個(gè)特定大小的存儲(chǔ)單元,給變量賦值就是將該值存儲(chǔ)到相應(yīng)的存儲(chǔ)單元中,給變量分配存儲(chǔ)單元是由編譯程序來完成的,分配給變量的存儲(chǔ)單元一般是來自內(nèi)存。但是,我們可以通過將int變量聲明為存儲(chǔ)類型register,而把存放器(CPU中的存儲(chǔ)單元)分配給它,這樣有關(guān)該變量的運(yùn)算速度將得到提高。例:{registerinti;for(i=0;i<MAX;++i){……}}注意:存放器變量i盡可能在接近使用它的位置處進(jìn)行聲明。

外部變量(extern)是全局變量,它可以在其他程序文件中使用。本節(jié)將介紹的靜態(tài)(static)變量只能在本程序文件中可以用。存儲(chǔ)類型符static有兩種用法,一種用于聲明變量,另一種用于聲明函數(shù)。

12.4存儲(chǔ)類型static變量可有兩種,一種是局部的,即在塊內(nèi)定義的變量;另一種是外部的,即在塊外和函數(shù)外定義的變量?!?〕首先介紹聲明局部變量為static的情形。此種情形,允許局部變量保持它的原有值,以便再次進(jìn)入塊內(nèi)時(shí)使用它。1.變量聲明為存儲(chǔ)類型static#include<stdio.h>voidf(void);intmain(void){f();f();f();return0;}voidf(void){intcnt=0;++cnt;printf("\ncnt=%d",cnt);}運(yùn)行結(jié)果:cnt=0cnt=0cnt=0修改為:staticintcnt=0;運(yùn)行結(jié)果:

cnt=1cnt=2cnt=3這種情形,不管程序如何執(zhí)行,變量也保持它的原有值,但是,不允許其他文件對它進(jìn)行訪問,即一個(gè)文件中static類型的外部變量不能被其他文件“操作〞,即它對外而言是不可見的,這種變量也稱為私有變量。(2)聲明外部變量為static的情形。程序文件file1.c:程序文件file2.c:#include<stdio.h>externvoidf(void);intmain(void){f();f();f();return0;}#include<stdio.h>staticintcnt=0;voidf(void){++cnt;printf(“\ncnt=%d”,cnt);}

與靜態(tài)外部變量類似,靜態(tài)外部(static)函數(shù)也是所屬文件的私有函數(shù),只能在該文件中被其他函數(shù)調(diào)用,對其他文件是不可見的。該功能對開發(fā)函數(shù)定義的私有模塊是很有用的。2.函數(shù)聲明為存儲(chǔ)類型static程序文件file1.c:程序文件file2.c:#include<stdio.h>externintF(void);intmain(void){F();F();F();return0;}#include<stdio.h>staticintcnt=0;staticintf(void){++cnt;printf(“\ncnt=%d”,cnt);}voidF(void){f();}類型限定符const用于限制對象的值被修改,它告訴編譯器防止用戶修改對象的值。一般情況,在聲明中const出現(xiàn)在存儲(chǔ)類型符之后類型符之前,考慮聲明staticconstintk=3;我們把它讀作“k是一個(gè)靜態(tài)存儲(chǔ)類型的整型常量〞。由于已經(jīng)用const限定了k的類型,我們可以對k進(jìn)行初始化,但以后不能再對k賦值、增量或減量。12.5類型限定符const不能把由const限定的變量的地址賦值給非限定的指針。下面會(huì)引起編譯器報(bào)警:constinta=8;int*ptr=&a;其原因是&a是“constint*〞類型的值,不能將它賦值給“int*〞類型的變量ptr。另一方面,以下是允許的:constinta=8;constint*ptr=&a;注意:這里ptr本身不是一個(gè)常量,所以,修改ptr的值是可以的,如以下是合法的:constinta=8,b=9;constint*ptr=&a;ptr=&b;如果要使ptr本身是常量,而不是它所指的對象,那么可以用如下聲明來完成:inta=8;int*constptr=&a;把后一聲明讀作“ptr是一個(gè)指向int的常量指針,其初始值是a的地址〞。此后,不能對ptr賦值,但可以對*ptr賦值。再考慮constinta=8;constint*constptr=&a;后一個(gè)聲明告訴編譯器ptr是一個(gè)指向常量int的常量指針。對ptr和*ptr都不能賦值、增量或減量。#include<stdio.h>voidG(constint);intmain(void){intn=5;G(n);……}voidG(constintm){m=m+2;……}const用于函數(shù)參數(shù)有4種情形。1.const限制的函數(shù)參數(shù)是一般變量函數(shù)G()定義中聲明的參數(shù)m被限制為常量(const)但函數(shù)體中試圖改變它的值,這是錯(cuò)誤的。2.指向常量數(shù)據(jù)的非常量指針#include<stdio.h>voidG(constint*);intmain(void){ints[]={1,2,3,4,5};G(s);……}voidG(constint*p){p=p+1;*p=*p+2;……}函數(shù)G()定義中聲明參數(shù)ptr為指向int常量數(shù)據(jù)的非常量指針,所以函數(shù)體中“p=p+1〞改變指針本身,這是合法的;而“*p=*p+2〞試圖改變指針?biāo)傅闹担@是錯(cuò)誤的。#include<stdio.h>voidG(int*const);intmain(void){ints[]={1,2,3,4,5};G(s);……}voidG(int*constp){p=p+1;*p=*p+2;……}3.指向非常量數(shù)據(jù)的常量指針函數(shù)G()定義中聲明參數(shù)ptr為指向int數(shù)據(jù)的常量指針,所以函數(shù)體中“p=p+1〞試圖改變指針本身,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論