版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年標(biāo)準(zhǔn)版土地買賣協(xié)議集錦版B版
- 2024年度游艇轉(zhuǎn)讓與海洋保險(xiǎn)配套服務(wù)合同3篇
- 在絲綢之路的新篇章重塑長安之城的城市與旅游新格局
- 幼兒園勞動(dòng)系統(tǒng)課程設(shè)計(jì)
- 拆遷房屋買賣合同的適用對象
- 企業(yè)短期貸款合同
- 招標(biāo)采購合同簽訂要點(diǎn)
- 木工散工計(jì)時(shí)工勞務(wù)協(xié)議
- 環(huán)保包裝材料訂購合同
- 版股東間借款合同
- 環(huán)保監(jiān)測數(shù)據(jù)質(zhì)量控制預(yù)案
- 2024新人教版英語七年級上單詞默寫單(小學(xué)部分)
- 2021-2022學(xué)年第二學(xué)期《大學(xué)生職業(yè)發(fā)展與就業(yè)指導(dǎo)2》學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 借款協(xié)議(父母借款給子女買房協(xié)議)(二篇)
- SOAP病例書寫規(guī)范
- 2024年黑龍江大慶林甸縣退役軍人服務(wù)中心選調(diào)歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 外研版英語2024七年級上冊全冊單元知識(shí)清單(記憶版)
- 期末檢測試卷(試題)-2024-2025學(xué)年四年級上冊數(shù)學(xué)青島版
- 保潔服務(wù)報(bào)價(jià)方案
- 問題解決策略歸納課件北師大版七年級數(shù)學(xué)上冊
- 國家開放大學(xué)電大本科《工程經(jīng)濟(jì)與管理》2023-2024期末試題及答案(試卷代號:1141)
評論
0/150
提交評論