變量存儲(chǔ)方式_第1頁
變量存儲(chǔ)方式_第2頁
變量存儲(chǔ)方式_第3頁
變量存儲(chǔ)方式_第4頁
變量存儲(chǔ)方式_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、C語言的強(qiáng)大功能之一是可以靈活地定義數(shù)據(jù)的存儲(chǔ)方式 .C語言從 兩個(gè)方面控制變量的性質(zhì):作用域(scope和生存期(lifetime).作用域 是指可以存取變量的代碼范圍,生存期是指可以存取變量的時(shí)間范圍.作用域有三種:1. extern(外部的)這是在函數(shù)外部定義的變量的缺省存儲(chǔ)方 式.extern變量的作用域是整個(gè)程序2. static靜態(tài)的)在函數(shù)外部說明為static的變量的作用域?yàn)閺亩?義點(diǎn)到該文件尾部;3. auto(自動(dòng)的)這是在函數(shù)內(nèi)部說明的變量的缺省存儲(chǔ)方式.auto變量的作用域?yàn)閺亩x點(diǎn)到該局部程序塊尾部.變量的生存期也有三種,但它們不象作用域那樣有預(yù)定義的關(guān)鍵字名稱.第一

2、種是extern和static變量的生存期,它從main()函數(shù)被調(diào) 用之前開始,到程序退出時(shí)為止第二種是函數(shù)參數(shù)和 auto變量的生 存期,它從函數(shù)調(diào)用時(shí)開始,到函數(shù)返回時(shí)為止.第三種 是動(dòng)態(tài)分配的 數(shù)據(jù)的生存期,它從程序調(diào)用malloc()或 calloc()為數(shù)據(jù)分配存儲(chǔ)空間 時(shí)開始,到程序調(diào)用free()或程序退出時(shí)為止.2.1變量存儲(chǔ)在內(nèi)存(memory)中的什么地方?變量可以存儲(chǔ)在內(nèi)存中的不同地方,這依賴于它們的生存期.在函 數(shù)外部定義的變量(全局變量或靜態(tài)外部變量)和在函數(shù)內(nèi)部定義的 static變量,其生存期就是程序運(yùn)行的全過程,這些變量被存儲(chǔ)在數(shù)據(jù) 段(datasegment

3、中數(shù)據(jù)段是在內(nèi)存中為這些變量留出的一段大小固定的空間,它分為兩部分,一部分用來存放初始化變量,另一部分用來 存放未初始化變量在函數(shù)內(nèi)部定義的auto變量(沒有用關(guān)鍵字static 定義的變量)的生存期從程序開始執(zhí)行其所在的程序塊代碼時(shí)開始,到程序離開該程序塊時(shí)為止作為函數(shù)參數(shù)的變量只在調(diào)用該函數(shù)期 間存在.這些變量被存儲(chǔ)在棧(stack)中.棧是內(nèi)存中的一段空間,開始 很小,以后逐漸自動(dòng)增大,直到達(dá)到某個(gè)預(yù)定義的界限在象DOS這樣 的沒有虛擬內(nèi)存(virtual memory)的系統(tǒng)中,這個(gè)界限由系統(tǒng)決定,并 且通常非常大,因此程序員不必?fù)?dān)心用盡棧空間關(guān)于虛擬內(nèi)存的討論, 請參見2.3.第三種

4、(也是最后一種)內(nèi)存空間實(shí)際上并不存儲(chǔ)變量,但是可以 用來存儲(chǔ)變量所指向的數(shù)據(jù)如果把調(diào)用malloc()函數(shù)的結(jié)果賦給一 個(gè)指針變量,那么這個(gè)指針變量將包含一塊動(dòng)態(tài)分配的內(nèi)存的地址,這塊內(nèi)存位于一段名為堆(heap)的內(nèi)存空間中堆開始時(shí)也很小,但當(dāng) 程序員調(diào)用malloc(或calloc()等內(nèi)存分配函數(shù)時(shí),它就會(huì)增大堆可 以和數(shù)據(jù)段或棧共用一個(gè)內(nèi)存段(memorysegment),也可以有它自己 的內(nèi)存段,這完全取決于編譯選項(xiàng)和操作系統(tǒng)與棧相似,堆也有一個(gè)增長界限,并且決定這個(gè)界限的規(guī)則與棧相同.請參見:1.1什么是局部程序塊(10calblock)?2.2變量必須初始化嗎?2.3 什么是頁

5、抖動(dòng)(pagethrashing)?7.20什么是棧(stack)?7.21什么是堆(heap)72.2變量必須初始化嗎?不.使用變量之前應(yīng)該給變量一個(gè)值,一個(gè)好的編譯程序?qū)椭?發(fā)現(xiàn)那些還沒有被給定一個(gè)值就被使用的變量不過,變量不一定需要初始化在函數(shù)外部定義的變量或者在函數(shù)內(nèi)部用static關(guān)鍵字定義的變量(被定義在數(shù)據(jù)段中的那些變量,見2.1)在沒有明確地被程序初 始化之前都已被系統(tǒng)初始化為0 了 .在函數(shù)內(nèi)部或程序塊內(nèi)部定義的不帶static關(guān)鍵字的變量都是自動(dòng)變量,如果你沒有明確地初始化這 些變量,它們就會(huì)具有未定義值.如果你沒有初始化一個(gè)自動(dòng)變量,在 使用它之前你就必須保證先給它賦

6、值.調(diào)用malloc()函數(shù)從堆中分配到的空間也包含未定義的數(shù)據(jù),因此在使用它之前必須先進(jìn)行初始化,但調(diào)用calloc()函數(shù)分配到的空間在分配時(shí)就已經(jīng)被初始化為0了.請參見:1.1什么是局部程序塊(10calblock)?7.20什么是棧(stack)?7.21什么是堆(heap)?2.3 什么是頁抖動(dòng)(pagethrashing)?有些操作系統(tǒng)(如UNIX和增強(qiáng)模式下的Windows使用虛擬內(nèi)存, 這是一種使機(jī)器的作業(yè)地址空間大于實(shí)際內(nèi)存的技術(shù),它是通過用磁盤空間模擬 RAM(random access memory來實(shí)現(xiàn)的.在80386和更 高級(jí)的Intel CPU芯片中,在現(xiàn)有的大多數(shù)

7、其它微處理器(如 Motorola 68030,sparc和Power PC)中,都有一個(gè)被稱為內(nèi)存管理單元 (Memory Management Unit,縮寫為 MMU)的器件.MMU 把內(nèi)存看作 是由一系列頁(page)組成的來處理一頁內(nèi)存是指一個(gè)具有一定大 小的連續(xù)的內(nèi)存塊,通常為4096或8192字節(jié)操作系統(tǒng)為每個(gè)正在運(yùn) 行的程序建立并維護(hù)一張被稱為進(jìn)程內(nèi)存映射 (Process Memory Map縮與為 PMM)的表,表中記錄了程序可以存取 的所有內(nèi)存頁以及它們的實(shí)際位置 每當(dāng)程序存取一塊內(nèi)存時(shí),它會(huì) 把相應(yīng)的地址(虛擬地址virtual address傳送給 MMU,MMU 會(huì)

8、在 PMM 中查找這塊內(nèi)存的實(shí)際位置 (物理地址physical address物理 地址可以是由操作系統(tǒng)指定的在內(nèi)存中或磁盤上的任何位置如果程序要存取的位置在磁盤上,就必須把包含該地址的頁從磁盤上讀到內(nèi) 存中,并且必須更新PMM以反映這個(gè)變化(這被稱為pagefault,即頁 錯(cuò)).希望你繼續(xù)讀下去,因?yàn)橄旅婢鸵榻B其中的難點(diǎn)了 存取磁盤比存取 RAM要慢得多,所以操作系統(tǒng)會(huì)試圖在 RAM中保持盡量多的虛擬內(nèi) 存如果你在運(yùn)行一個(gè)非常大的程序(或者同時(shí)運(yùn)行幾個(gè)小程序),那么 可能沒有足夠的RAM來承擔(dān)程序要使用的全部內(nèi)存,因此必須把一 些頁從RAM中移到磁盤上(這被為pagingout即頁出)

9、.操作系統(tǒng)會(huì)試圖去判斷哪些頁可能暫時(shí)不會(huì)被使用(通?;谶^去使用內(nèi)存的情況),如果它判斷錯(cuò)了,或者程序正在很多地方存取很多 內(nèi)存,那么為了讀入已調(diào)出的頁,就會(huì)產(chǎn)生大量頁錯(cuò)動(dòng)作因?yàn)镽AM已 被全部使用,所以為了調(diào)入要存取的一頁,必須調(diào)出另一頁,而這將導(dǎo) 致更多的頁錯(cuò)動(dòng)作,因?yàn)榇藭r(shí)不同的一頁已被移到磁盤上在短時(shí)間內(nèi) 出現(xiàn)大量頁錯(cuò)動(dòng)作的情形被稱為頁抖動(dòng),它將大大降低系統(tǒng)的執(zhí)行效 率頻繁存取內(nèi)存中大量散布的位置的程序更容易在系統(tǒng)中造成頁 抖動(dòng).如果同時(shí)運(yùn)行許多小程序,而實(shí)際上已經(jīng)不再使用這些程序,也很容易造成頁抖動(dòng)為了減少頁抖動(dòng),你應(yīng)該減少同時(shí)運(yùn)行的程序的數(shù) 目對(duì)于大的程序,你應(yīng)該改變它的工作方式,以

10、盡量使操作系統(tǒng)能準(zhǔn) 確地判斷出哪些頁不再需要為此,你可以使用高速緩沖存儲(chǔ)技術(shù),或 者改變用于大型數(shù)據(jù)結(jié)構(gòu)的查找算法,或者使用效率更高的 malloc() 函數(shù)當(dāng)然,你也可以考慮增加系統(tǒng)的 RAM,以減少頁出動(dòng)作.請參見:7.17怎樣說明一個(gè)大于640KB的數(shù)組?7.21什么是堆(heap)?18.14怎樣才能使DOS程序獲得超過64KB的可用內(nèi)存?21.31 Windows是怎樣組織內(nèi)存的?2.4什么是const指針?如果希望一個(gè)變量在被初始化后其值不會(huì)被修改,程序員就會(huì)通過cons修飾符和編譯程序達(dá)成默契編譯程序會(huì)努力去保證這種默契它將禁止程序中出現(xiàn)對(duì)說明為const的變量進(jìn)行修改的代碼.

11、const指針的準(zhǔn)確提法應(yīng)該是指向const數(shù)據(jù)的指針,即它所指向的數(shù) 據(jù)不能被修改只要在指針說明的開頭加入const修飾符,就可說明一 個(gè)cosnt指針盡管const指針?biāo)赶虻臄?shù)據(jù)不能被修改,但cosnt指針本身是可以修改的下面給出了 const指針的一些合法和非法的用 法例子:const char *str=hello;char c=*str; /*legal*/str+; /*legal*/*str=a;/* illegal */str1=b; illegal*/前兩條語句是合法的,因?yàn)樗鼈儧]有修改str所指向的數(shù)據(jù);后兩 條語句是非法的,因?yàn)樗鼈円薷膕tr所指向的數(shù)據(jù)在說明函數(shù)參數(shù)

12、 時(shí),常常要使用const指針例如,一個(gè)計(jì)算字符串長度的函數(shù)不必改變 字符串內(nèi)容,它可以寫成這樣:my_strlen(const char *str)int count=0;while ( * str+)count +;return count;注意,如果有必要,一個(gè)非const指針可以被隱式地轉(zhuǎn)換為const指針,但一個(gè)const指針不能被轉(zhuǎn)換成非const指針這就是說,在調(diào)用 my_strlen()時(shí),它的參數(shù)既可以是一個(gè)const指針,也可以是一個(gè)非const指針請參見:2.7 個(gè)變量可以同時(shí)被說明為 const和 volatile嗎?2.8什么時(shí)候應(yīng)該使用const修飾符?2.14什么

13、時(shí)候不應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換(type cast)?2. 18用const說明常量有什么好處?2.5什么時(shí)候應(yīng)該使用register修飾符?它真的有用嗎?register修飾符暗示編譯程序相應(yīng)的變量將被頻繁使用,如果可能的話,應(yīng)將其保存在CPU的寄存器中,以加快其存取速度.但是,使用 register修飾符有幾點(diǎn)限制.首先register變量必須是能被CPU寄存 器所接受的類型.這通常意味著register變量必須是一個(gè)單個(gè)的值,并 且其長度應(yīng)小于或等于整型的長度.但是,有些機(jī)器的寄存器也能存放 浮點(diǎn)數(shù).其次,因?yàn)閞egister變量可能不存放在內(nèi)存中,所以不能用取 址運(yùn)算符&來獲取regist

14、er變量的地址.如果你試圖這樣做,編譯程序就會(huì)報(bào)告這是一個(gè)錯(cuò)誤register修飾符的用處有多大還受其它一 些規(guī)則的影響因?yàn)榧拇嫫鞯臄?shù)量是有限的,而且某些寄存器只能接受 特定類型的數(shù)據(jù)(如指針和浮點(diǎn)數(shù)),因此,真正能起作用的register修 飾符的數(shù)目和類型都依賴于運(yùn)行程序的機(jī)器,而任何多余的register修飾符都將被編譯程序所忽略在某些情況下,把變量保存在寄存器中反而會(huì)降低運(yùn)行速度,因?yàn)楸徽加玫募拇嫫鞑荒茉儆糜谄渌康模蛞徽咦兞勘皇褂玫拇螖?shù)不 夠多,不足以抵消裝入和存儲(chǔ)變量所帶來的額外開銷那么,什么時(shí)候應(yīng)該使用register修飾符呢?回答是,對(duì)現(xiàn)有的大多數(shù)編譯程序來說, 永遠(yuǎn)不要使用

15、register修飾符早期的C編譯程序不會(huì)把變量保存在 寄存器中,除非你命令它這樣做,這時(shí)register修飾符是C語言的一種 很有價(jià)值的補(bǔ)充然而,隨著編譯程序設(shè)計(jì)技術(shù)的進(jìn)步,在決定哪些變 量應(yīng)該被存到寄存器中時(shí),現(xiàn)在的C編譯程序能比程序員作出更好的 決定實(shí)際上,許多C編譯程序會(huì)忽略register修飾符,因?yàn)楸M管它完 全合法,但它僅僅是暗示而不是命令在極罕見的情況下,程序運(yùn)行速 度很慢,而你也知道這是因?yàn)橛幸粋€(gè)變量被存儲(chǔ)在內(nèi)存中,也許你最后會(huì)試圖在該變量前面加上register修飾符,但是,如果這并沒有加快程序的運(yùn)行速度,你也不要感到奇怪請參見:2.6什么時(shí)候應(yīng)該使用volatile修飾符?

16、2. 6什么時(shí)候應(yīng)該使用volatile修飾符?volatile修飾符告訴編譯程序不要對(duì)該變量所參與的操作進(jìn)行某 些優(yōu)化在兩種特殊的情況下需要使用volatile修飾符:第一種情況涉及到內(nèi)存映射硬件(memory-mapped hardware如圖形適配器,這類設(shè) 備對(duì)計(jì)算機(jī)來說就好象是內(nèi)存的一部分一樣),第二種情況涉及到共享內(nèi)存(shared memory即被兩個(gè)以上同時(shí)運(yùn)行的程序所使用的內(nèi)存).大多數(shù)計(jì)算機(jī)擁有一系列寄存器,其存取速度比計(jì)算機(jī)主存更快好 的編譯程序能進(jìn)行一種被稱為冗余裝入和存儲(chǔ)的刪去(r edundant load and store removal的優(yōu)化,即編譯程序會(huì) 在

17、程序中尋 找并刪去這樣兩類代碼:一類是可以刪去的從內(nèi)存裝入數(shù)據(jù)的指令,因?yàn)橄鄳?yīng)的數(shù)據(jù)已經(jīng)被存放在寄存器中;另一種是可以刪去的將數(shù)據(jù) 存入內(nèi)存的指令,因?yàn)橄鄳?yīng)的數(shù)據(jù)在再次被改變之前可以一直保留在 寄存器中如果一個(gè)指針變量指向普通內(nèi)存以外的位置,如指向一個(gè)外圍設(shè)備的內(nèi)存映射端口 ,那么冗余裝入和存儲(chǔ)的優(yōu)化對(duì)它來說可能 是有害的例如,為了調(diào)整某個(gè)操作的時(shí)間,可能會(huì)用到下述函數(shù): time_t time_addition(volatile const struct timer * t, int a),int nint xtime_t thenx=0;then= t-valuefor (n=O; nvl

18、OOO; n+) x=x+a ;return t-value - then;在上述函數(shù)中,變量t-value實(shí)際上是一個(gè)硬件計(jì)數(shù)器,其值隨時(shí) 間增加該函數(shù)執(zhí)行1000次把a(bǔ)值加到x上的操作,然后返回t- value 在這1000次加法的執(zhí)行期間所增加的值如果不使用volatile修飾符, 一個(gè)聰明的編譯程序可能就會(huì)認(rèn)為t-value在該函數(shù)執(zhí)行期間不會(huì)改變,因?yàn)樵摵瘮?shù)內(nèi)沒有明確地改變t-value的語句這樣,編譯程序就 會(huì)認(rèn)為沒有必要再次從內(nèi)存中讀入t-value并將其減去then,因?yàn)榇鸢赣肋h(yuǎn)是0因此,編譯程序可能會(huì)對(duì)該函數(shù)進(jìn)行優(yōu)化,結(jié)果使得該函 數(shù)的返回值永遠(yuǎn)是0.如果一個(gè)指針變量指向共享

19、內(nèi)存中的數(shù)據(jù),那么冗余裝入和存儲(chǔ)的優(yōu)化對(duì)它來說可能也是有害的,共享內(nèi)存通常用來實(shí)現(xiàn)兩個(gè)程序之間 的互相通訊,即讓一個(gè)程序把數(shù)據(jù)存到共享的那塊內(nèi)存中,而讓另一個(gè) 程序從這塊內(nèi)存中讀數(shù)據(jù)如果從共享內(nèi)存裝入數(shù)據(jù)或把數(shù)據(jù)存入共 享內(nèi)存的代碼被編譯程序優(yōu)化掉了 ,程序之間的通訊就會(huì)受到影響.請參見:2.7 個(gè)變量可以同時(shí)被說明為 const和volatile嗎?2.14什么時(shí)候不應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換(typecast)?2.7個(gè)變量可以同時(shí)被說明為 const和 volatile嗎?可以.const修飾符的含義是變量的值不能被使用了const修飾符的那段代碼修改,但這并不意味著它不能被這段代碼以外的其它

20、手段修 改例如,在2.6的例子中,通過一個(gè)volatile const指針t來存取timer 結(jié)構(gòu)函數(shù)time_addition()本身并不修改t-value的值,因此t-value 被說明為const不過,計(jì)算機(jī)的硬件會(huì)修改這個(gè)值,因此t-value又被 說明為volatile.如果同時(shí)用const和volatile來說明一個(gè)變量,那么這 兩個(gè)修飾符隨便哪個(gè)在先都行,請參見:2.6什么時(shí)候應(yīng)該使用volatile修飾符?2.8什么時(shí)候應(yīng)該使用const修飾符?2.14什么時(shí)候不應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換(typecast)?2.8什么時(shí)候應(yīng)該使用const修飾符?使用const修飾符有幾個(gè)原因,第

21、一個(gè)原因是這樣能使編譯程序找出程序中不小心改變變量值的錯(cuò)誤.請看下例:while ( * str=0) / * programmer meant to write * str! =0 * / / * some code here * /strq+;其中的=符號(hào)是輸入錯(cuò)誤如果在說明str時(shí)沒有使用const修飾符,那么相應(yīng)的程序能通過編譯但不能被正確執(zhí)行第二個(gè)原因是效率.如果編譯程序知道某個(gè)變量不會(huì)被修改,那么它可能會(huì)對(duì)生成的代 碼進(jìn)行某些優(yōu)化如果一個(gè)函數(shù)參數(shù)是一個(gè)指針,并且你不希望它所 指向的數(shù)據(jù)被該函數(shù)或該函數(shù)所調(diào)用的函數(shù)修改,那么你應(yīng)該把該參數(shù)說明為const指針如果一個(gè)函數(shù)參數(shù)通過值(而

22、不是通過指針)被傳 遞給函數(shù),并且你不希望其值被該函數(shù)所調(diào)用的函數(shù)修改,那么你應(yīng)該 把該參數(shù)說明為const然而,在實(shí)際編程中,只有在編譯程序通過指針 存取這些數(shù)據(jù)的效率比拷貝這些數(shù)據(jù)更高時(shí),才把這些參數(shù)說明為const.請參見:2.7 個(gè)變量可以同時(shí)被說明為 const和 volatile嗎?2.14什么時(shí)候不應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換(typecast)?2.18用const說明常量有什么好處?2.9浮點(diǎn)數(shù)比較(floating-point comparisons的可靠性如何?浮點(diǎn)數(shù)是計(jì)算機(jī)編程中的魔法(black art),原因之一是沒有一種 理想的方式可以表示一個(gè)任意的數(shù)字電子電氣工程協(xié)會(huì)(

23、IEEE)已經(jīng) 制定出浮點(diǎn)數(shù)的表示標(biāo)準(zhǔn),但你不能保證所使用的每臺(tái)機(jī)器都遵循這 一標(biāo)準(zhǔn).即使你使用的機(jī)器遵循這一標(biāo)準(zhǔn),還存在更深的問題從數(shù)學(xué) 意義上講,兩個(gè)不同的數(shù)字之間有無窮個(gè)實(shí)數(shù)計(jì)算機(jī)只能區(qū)分至少有 一位(bit)不同的兩個(gè)數(shù)字如果要表示那些無窮無盡的各不相同的數(shù) 字,就要使用無窮數(shù)目的位計(jì)算機(jī)只能用較少的位(通常是32位或64 位)來表示一個(gè)很大的范圍內(nèi)的數(shù)字,因此它只能近似地表示大多數(shù) 數(shù)字.由于浮點(diǎn)數(shù)是如此難對(duì)付,因此比較一個(gè)浮點(diǎn)數(shù)和某個(gè)值是否 相等或不等通常是不好的編程習(xí)慣但是,判斷一個(gè)浮點(diǎn)數(shù)是否大于或 小于某個(gè)值就安全多了 例如,如果你想以較小的步長依次使用一個(gè)范 圍內(nèi)的數(shù)字,你可

24、能會(huì)編寫這樣一個(gè)程序:#include const float first = 0.0;const float last = 70.0 const float small= O.007 main ()float f;for (f=first; f !=last & fvlast+1 O; f +=small)printf(f is now %gn, f);然而,舍入誤差(rounding error)和變量small的表示誤差可能導(dǎo)致f永遠(yuǎn)不等于last(f可能會(huì)從稍小于last的一個(gè)數(shù)增加到一個(gè)稍大于 last的數(shù)),這樣,循環(huán)會(huì)跳過last加入不等式fvlast+1.0就是為了防 止在這種

25、情況發(fā)生后程序繼續(xù)運(yùn)行很長時(shí)間.如果運(yùn)行該程序并且被 打印出來的f值是71或更大的數(shù)值,就說明已經(jīng)發(fā)生了這種情況一 種較安全的方法是用不等式fvlast作為條件來終止循環(huán),例如:float f;for(f=first; fvlast; f+=small)你甚至可以預(yù)先算出循環(huán)次數(shù),然后通過這個(gè)整數(shù)進(jìn)行循環(huán)計(jì)數(shù): float f;int count=(last-first)/small;for(f=first;count-0;f+=small);請參見:2.11對(duì)不同類型的變量進(jìn)行算術(shù)運(yùn)算會(huì)有問題嗎?2.10怎樣判斷一個(gè)數(shù)字型變量可以容納的最大值?要判斷某種特定類型可以容納的最大值或最小值 ,一

26、種簡便的方法 是使用ANSI標(biāo)準(zhǔn)頭文件limitsh中的預(yù)定義值該文件包含些很有用 的常量,它們定義了各種類型所能容納的值,下表列出了這些常量:常量描述CHAR BITchar的位數(shù)(bit)CHAR MAXchar的十進(jìn)制整數(shù)最大值CHAR MINchar的十進(jìn)制整數(shù)最小值MB LEN MAX 多字節(jié)字符的最大字節(jié)(byte)數(shù)INT MAXint的十進(jìn)制最大值INT MINint的十進(jìn)制最小值LONG MAXlong的十進(jìn)制最大值LONG MINlong的十進(jìn)制最小值SCHARMAXsignedchar的十進(jìn)制整數(shù)最大值SCHARMINsignedchar的十進(jìn)制整數(shù)最小值SHRT MIN

27、short的十進(jìn)制最小值SHRT MAXshort的十進(jìn)制最大值UCHARMAXunsignedchar的十進(jìn)制整數(shù)最大值UINT MAXunsignedint的十進(jìn)制最大值ULONG MAXunsignedlongint 的十進(jìn)制最大值USHRT MAXunsignedshortint 的十進(jìn)制最大值對(duì)于整數(shù)類型,在使用2的補(bǔ)碼運(yùn)算的機(jī)器(你將使用的機(jī)器幾乎都 屬此類)上,一個(gè)有符號(hào)類型可以容納的數(shù)字范圍為-2位數(shù)-1到(+2位 數(shù)-1-1),一個(gè)無符號(hào)類型可以容納的數(shù)字范圍為0到(+2位數(shù)-1)例如,一個(gè)16位有符號(hào)整數(shù)可以容納的數(shù)字范圍為-215(即-32768)到(+215-1)(即

28、+32767).請參見:10.1用什么方法存儲(chǔ)標(biāo)志(flag)效率最高?10.2 什么是位屏幕(bitmasking)?10.6 16位和32位的數(shù)是怎樣存儲(chǔ)的?2.11對(duì)不同類型的變量進(jìn)行算術(shù)運(yùn)算會(huì)有問題嗎?C有三類固有的數(shù)據(jù)類型:指針類型,整數(shù)類型和浮點(diǎn)類型;指針類 型的運(yùn)算限制最嚴(yán),只限于以下兩種運(yùn)算:-兩個(gè)指針相減,僅在兩個(gè) 指針指向同一數(shù)組中的元素時(shí)有效.運(yùn)算結(jié)果與對(duì)應(yīng)于兩個(gè)指針的數(shù) 組下標(biāo)相減的結(jié)果相同.+指針和整數(shù)類型相加.運(yùn)算結(jié)果為一個(gè)指 針,該指針與原指針之間相距n個(gè)元素,n就是與原指針相加的整數(shù).浮點(diǎn)類型包括float,double和longdouble這三種固有類型.整數(shù)

29、類型包括 char,unsigned char,short,unsigned hort,int,unsigned int,long和 unsigned long對(duì)這些類型都可進(jìn)行以下 4種算術(shù)運(yùn)算:+加-減*乘 /除對(duì)整數(shù)類型不僅可以進(jìn)行上述 4種運(yùn)算,還可進(jìn)行以下幾種運(yùn)算:% 取模或求余右移LONG_MAX unsigned longlong任何更小的類型longunsigned任何有符號(hào)類型unsigned下面的程序中就有幾個(gè)運(yùn)算符升級(jí)的例子變量n被賦值為3/4,因 為3和4都是整數(shù),所以先進(jìn)行整數(shù)除法運(yùn)算,結(jié)果為整數(shù)0.變量f2 被賦值為3/4.0,因?yàn)?.0是一個(gè)float類型,所以整

30、數(shù)3也被轉(zhuǎn)換為float 類型,結(jié)果為float類型0.75.#include vstdi o.hmain ()float f1 = 3/4;float f2 = 3/4.0printf(3/4= %g or %g depending on the typeused. n,f1, f2);請參見:2.11對(duì)不同類型的變量進(jìn)行算術(shù)運(yùn)算會(huì)有問題嗎?2.13什么時(shí)候應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換(typecast)?2.13什么時(shí)候應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換(typecast)?在兩種情況下需要使用類型強(qiáng)制轉(zhuǎn)換.第一種情況是改變運(yùn)算分量 的類型,從而使運(yùn)算能正確地進(jìn)行.下面的程序與2.12中的例子相似, 但有不同之

31、處.變量n被賦值為整數(shù)i除以整數(shù)j的結(jié)果,因?yàn)槭钦麛?shù) 相除,所以結(jié)果為0.變量f2也被賦值為i除以j的結(jié)果,但本例通過 (float)類型強(qiáng)制轉(zhuǎn)換把i轉(zhuǎn)換成一個(gè)float類型,因此執(zhí)行的是浮點(diǎn)數(shù) 除法運(yùn)算(見2.11)結(jié)果為0.75.#include main ()int i = 3;int j = 4float f1 =i/j;float f2= (float) i/j;printf(3/4= %g or %g depending on the type used n,f1, f2);第二種情況是在指針類型和 void *類型之間進(jìn)行強(qiáng)制轉(zhuǎn)換,從而與期 望或返回void指針的函數(shù)進(jìn)行正確的交

32、接例如,下述語句就把函數(shù) malloc()的返回值強(qiáng)制轉(zhuǎn)換為一個(gè)指向foo結(jié)構(gòu)的指針:struct foo *p=(struct foo *)malloc(sizeof(struct foo);請參見:2.6什么時(shí)候應(yīng)該使用volatile修飾符?2.8什么時(shí)候應(yīng)該使用const修飾符?2.11對(duì)不同類型的變量進(jìn)行算術(shù)運(yùn)算會(huì)有問題嗎 ?2.12什么是運(yùn)算符升級(jí)(operator promotion)?2.14什么時(shí)候不應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換(typecast)?7.5什么是void指針?7.6什么時(shí)候使用void指針?7.21什么是堆(heap)?7.27可以對(duì)void指針進(jìn)行算術(shù)運(yùn)算嗎?2.1

33、4什么時(shí)候不應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換(typecast)?不應(yīng)該對(duì)用const或 volatile說明了的對(duì)象進(jìn)行類型強(qiáng)制轉(zhuǎn)換,否則 程序就不能正確運(yùn)行.不應(yīng)該用類型強(qiáng)制轉(zhuǎn)換把指向一種結(jié)構(gòu)類型 或數(shù)據(jù)類型的指針轉(zhuǎn)換成指向另一種結(jié)構(gòu)類型或數(shù)據(jù)類型的指針在極少數(shù)需要進(jìn)行這種類型強(qiáng)制轉(zhuǎn)換的情況下,用共用體(union)來存放有關(guān)數(shù)據(jù)能更清楚地表達(dá)程序員的意圖.請參見:2. 6什么時(shí)候應(yīng)該使用volatile修飾符?2. 8什么時(shí)候應(yīng)該使用const修飾符?2. 15可以在頭文件中說明或定義變量嗎 ?被多個(gè)文件存取的全局變量可以并且應(yīng)該在一個(gè)頭文件中說明,并且必須在一個(gè)源文件中定義變量不應(yīng)該在頭文件中定義

34、,因?yàn)橐粋€(gè)頭 文件可能被多個(gè)源文件包含,而這將導(dǎo)致變量被多次定義如果變量的 初始化只發(fā)生一次,ANSIC標(biāo)準(zhǔn)允許變量有多次外部定義;但是,這樣 做沒有任何好處,因此最好避免這樣做,以使程序有更強(qiáng)的可移植性.注意:變量的說明和定義是兩個(gè)不同的概念,在2.16中將講解兩者 之間的區(qū)別.僅供一個(gè)文件使用的全局變量應(yīng)該被說明為static而 且 不應(yīng)該出現(xiàn)在頭文件中.請參見:2. 16說明一個(gè)變量和定義一個(gè)變量有什么區(qū)別 ?2. 17可以在頭文件中說明static變量嗎?2.16說明一個(gè)變量和定義一個(gè)變量有什么區(qū)別?說明一個(gè)變量意味著向編譯程序描述變量的類型,但并不為變量分配存儲(chǔ)空間定義一個(gè)變量意味著

35、在說明變量的同時(shí)還要為變量分配 存儲(chǔ)空間在定義一個(gè)變量的同時(shí)還可以對(duì)變量進(jìn)行初始化下例說明了一個(gè)變量和一個(gè)結(jié)構(gòu),定義了兩個(gè)變量,其中一個(gè)定義帶初始化: extern int decll; / * this is a declaration * /struct decl2 int member; ; / * this just declares the type-no variable mentioned * /int defl = 8;/ * this is a definition * /int def2; / * this is a definition * /換句話說,說明一個(gè)變量相當(dāng)于

36、告訴編譯程序在程序的某個(gè)位置將用到一個(gè)變量,這里給出了它的名稱和類型,定義一個(gè)量則相當(dāng)于 告訴編譯程序具有這個(gè)名稱和這種類型的變量就在這里.一個(gè)變 量可以被說明許多次,但只能被定義一次因此,不應(yīng)該在頭文件中定 義變量,因?yàn)橐粋€(gè)頭文件可能會(huì)被一個(gè)程序的許多源文件所包含.請參見;2.17可以在頭文件中說明static變量嗎?2.17可以在頭文件中說明static變量嗎?如果說明了一個(gè)static變量,就必須在同一個(gè)文件中定義該變量(因 為存儲(chǔ)類型修飾符static和extern是互斥的)你可以在頭文件中定義 一個(gè)static變量,但這會(huì)使包含該頭文件的源文件都得到該變量的一 份私有拷貝,而這通常不

37、是你想得到的結(jié)果.請參見:2.16說明一個(gè)變量和定義一個(gè)變量有什么區(qū)別?2.18用const說明常量有什么好處?使用關(guān)鍵字const有兩個(gè)好處;第一,如果編譯程序知道一個(gè)變量的 值不會(huì)改變,編譯程.序就能對(duì)程序進(jìn)行優(yōu)化;第二,編譯程序會(huì)試圖保 證該變量的值不會(huì)因?yàn)槌绦騿T的疏忽而被改變.當(dāng)然,用#define來定義常量也有同樣的好處用const而不用#define來定義常量的原因是 const變量可以是任何類型(如結(jié)構(gòu),而用#define定義的常量不能表 示結(jié)構(gòu)).此外,const變量是真正的變量,它有可供使用的地址,并且該 地址是唯一的(有些編譯程序在每次使用 #define定義的字符串時(shí)都

38、會(huì)生成一份新的拷貝,見9.9).請參見:2.7 個(gè)變量可以同時(shí)被說明為 const和 volatile嗎?2.8什么時(shí)候應(yīng)該使用const修飾符?2.14什么時(shí)候不應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換(typecast)?9.9字符串和數(shù)組有什么不同?從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。可以從另一個(gè)角度,從變量值存在的時(shí)間(即生 存期)角度來分,可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。所謂靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。而動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ) 空間的方式。用戶區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)先看一下內(nèi)存中的供用戶使用的存儲(chǔ)空間的情

39、況。這個(gè)存儲(chǔ)空間可以分為三部分,見圖8.16。1. 程序區(qū)2. 靜態(tài)存儲(chǔ)區(qū)3. 動(dòng)態(tài)存儲(chǔ)區(qū)數(shù)據(jù)分別存放在靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)中全局變量全部存放在靜態(tài)存儲(chǔ)區(qū)中,在程序開始執(zhí)行時(shí)給全局變量分 配存儲(chǔ)區(qū),程序執(zhí)行完畢就釋放。在程序執(zhí)行過程中它們占據(jù)固定的存儲(chǔ)單元, 而不是動(dòng)態(tài)地進(jìn)行分配 和釋放。在動(dòng)態(tài)存儲(chǔ)區(qū)中存放以下數(shù)據(jù): 函數(shù)形式參數(shù)。在調(diào)用函數(shù)時(shí)給形參分配存儲(chǔ)空間。 自動(dòng)變量(未加static聲明的局部變量,詳見后面的介紹)。 函數(shù)調(diào)用時(shí)的現(xiàn)場保護(hù)和返回地址等。對(duì)以上這些數(shù)據(jù),在函數(shù)調(diào)用開始時(shí)分配動(dòng)態(tài)存儲(chǔ)空間,函數(shù)結(jié)束時(shí)釋放這些空間。在程序執(zhí)行 過程中,這種分配和釋放是動(dòng)態(tài)的,如果在一個(gè)程序中

40、兩次調(diào)用同一 函數(shù),分配給此函數(shù)中局部變量的存儲(chǔ)空間地址可能是不相同的。如果一個(gè)程序包含若干個(gè)函數(shù),每個(gè)函數(shù)中的局部變量的生存期并不等 于整個(gè)程序的執(zhí)行周期,它只是程序執(zhí)行周期的一部分。根據(jù)函數(shù)調(diào) 用的需要,動(dòng)態(tài)地分配和釋放存儲(chǔ)空間。在C語言中每一個(gè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ)類別。數(shù)據(jù)類型,讀者已熟悉(如整型、字符型等)。存儲(chǔ)類別指 的是數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方法。存儲(chǔ)方法分為兩大類:靜態(tài)存儲(chǔ)類和 動(dòng)態(tài)存儲(chǔ)類。具體包含四種:自動(dòng)的(auto),靜態(tài)的(static ),寄存器的(register ),外部的(extern )O根據(jù)變量的存儲(chǔ)類別,可以知道變量的作用域和生存期。F面分

41、別作介紹。auto int b釋放a, b, cintf (int aa是形參,b、8.9.2 auto 變量函數(shù)中的局部變量,如不專門聲明為static分配存儲(chǔ)空間的,數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中中定義的變量(包括在復(fù)合語句中定義的變量)存儲(chǔ)類別,都是動(dòng)態(tài)地函數(shù)中的形參和在函數(shù),都屬此類,在調(diào)用該函數(shù)時(shí)系統(tǒng)會(huì)給它們分配存儲(chǔ)空間,在函數(shù)調(diào)用結(jié)束時(shí)就自動(dòng)釋放這些存儲(chǔ)空間。因此這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字auto作存儲(chǔ)類別的聲明。例如:)/*定義f函數(shù),a為形參*/,c = 3; /*定義b、c為自動(dòng)變量*/c是自動(dòng)變量,對(duì)c賦初值3。執(zhí)行完f函數(shù)后,自動(dòng)所占的存儲(chǔ)單元。實(shí)際上,關(guān)鍵字“

42、auto ”可以省略,auto不寫則隱含確定為“自動(dòng) 存儲(chǔ)類別”,它屬于動(dòng)態(tài)存儲(chǔ)方式。程序中大多數(shù)變量屬于自動(dòng)變量。 我們前面介紹的函數(shù)中定義的變量都沒有聲明為 auto,其實(shí)都隱含指定為自動(dòng)變量。例如,在函數(shù)體中:auto int b , c= 3;int b , c= 3;二者等價(jià)8.9.3用static聲明局部變量有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原 值,即其占用的存儲(chǔ)單元不釋放,在下一次該函數(shù)調(diào)用時(shí),該變量已 有值,就是上一次函數(shù)調(diào)用結(jié)束時(shí)的值。這時(shí)就應(yīng)該指定該局部變量 為“靜態(tài)局部變量”,用關(guān)鍵字 static進(jìn)行聲明。通過下面簡單的 例子可以了解它的特點(diǎn)。例8

43、.17考察靜態(tài)局部變量的值f (inta )auto b = 0;static c = 3;b= b+ 1;c = c + 1;return (a+b + c);main ()int a = 2, i ;for (i = 0; i v3; i + + )printf ( % d , f (a);運(yùn)行結(jié)果為:78 9在第1次調(diào)用f函數(shù)時(shí),b的初值為0, c的初值為3,第1次調(diào)用結(jié) 束時(shí),b= 1, c = 4, a+b + c = 7。由于c是靜態(tài)局部變量,在函數(shù)調(diào) 用結(jié)束后,它并不釋放,仍保留 c = 4。在第2次調(diào)用f函數(shù)時(shí),b 的初值為0,而c的初值為4 (上次調(diào)用結(jié)束時(shí)的值)。見圖 8.

44、17。 對(duì)靜態(tài)局部變量的說明:(1) 靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)態(tài)局部變量) 屬于動(dòng)態(tài)存儲(chǔ)類別,占動(dòng)態(tài)存儲(chǔ)區(qū)空間而不占靜態(tài)存儲(chǔ)區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2) 對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在程序 運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留 上次函數(shù)調(diào)用結(jié)束時(shí)的值。而對(duì)自動(dòng)變量賦初值,不是在編譯時(shí)進(jìn)行 的,而是在函數(shù)調(diào)用時(shí)進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相 當(dāng)于執(zhí)行一次賦值語句。(3) 如在定義局部變量時(shí)不賦初值的話, 則對(duì)靜態(tài)局部變量來說,編 譯時(shí)自動(dòng)賦初值0 (對(duì)數(shù)值型

45、變量)或空字符(對(duì)字符變量)。而對(duì)自動(dòng)變量來說,如果不賦初值則它的值是一個(gè)不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲(chǔ)單元已釋放,下次調(diào)用時(shí)又重新另分配存儲(chǔ) 單元,而所分配的單元中的值是不確定的。(4) 雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不 能引用它的。在什么情況下需要用局部靜態(tài)變量呢?(1) 需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。例如可以用下面方法求n!。例8.18打印1到5的階乘值int fac (intn )static int f = 1;f = f*n ;return (f);main ()int i ;for (i = 1; i = 5; i + + )printf

46、( %d!=% dn , i , fac (i );運(yùn)行結(jié)果為:1!= 12!= 23 ! = 64!= 245!=120每次調(diào)用fac (i ),打印出一個(gè)i !,同時(shí)保留這個(gè)i !的值以便下 次再乘(i + 1)。(2) 如果初始化后,變量只被引用而不改變其值,則這時(shí)用靜態(tài)局部 變量比較方便,以免每次調(diào)用時(shí)重新賦值。但是應(yīng)該看到,用靜態(tài)存儲(chǔ)要多占內(nèi)存(長期占用不釋放,而不能像 動(dòng)態(tài)存儲(chǔ)那樣一個(gè)存儲(chǔ)單元可供多個(gè)變量使用,節(jié)約內(nèi)存),而且降 低了程序的可讀性,當(dāng)調(diào)用次數(shù)多時(shí)往往弄不清靜態(tài)局部變量的當(dāng)前 值是什么。因此,如不必要,不要多用靜態(tài)局部變量。H.量8.9.4 register 變量一般

47、情況下,變量(包括靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式)的值是存放 在內(nèi)存中的。當(dāng)程序中用到哪一個(gè)變量的值時(shí),由控制器發(fā)出指令將 內(nèi)存中該變量的值送到運(yùn)算器中。經(jīng)過運(yùn)算器進(jìn)行運(yùn)算,如果需要存數(shù),再從運(yùn)算器將數(shù)據(jù)送到內(nèi)存存放。見圖8.18。如果有一些變量使用頻繁(例如在一個(gè)函數(shù)中執(zhí)行10000次循環(huán),每 次循環(huán)中都要引用某局部變量),則為存取變量的值要花不少時(shí)間。為提高執(zhí)行效率,C語言允許將局部變量的值放在CPU中的寄存器 中,需要用時(shí)直接從寄存器取出參加運(yùn)算,不必再到內(nèi)存中去存取。 由于對(duì)寄存器的存取速度遠(yuǎn)高于對(duì)內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做“寄存器變量”,用關(guān)鍵字regist

48、er作聲明。例如,例8.19是輸出1到5的階乘的值。例8.19使用寄存器變量。int fac (intn )register int i , f = 1;/ * 定義寄存器變量 * /for (i = 1; i = n; i + + )f = f*i ;retur n (f);main () int i ;for (i = 1; i y ? x : y;return (z);main ()extern A , B; /*外部變量聲明*/printf( % d, max (A, B);int A = 13, B=-8; / 定義外部變量 /運(yùn)行結(jié)果如下:13在本程序文件的最后1行定義了外部變量A

49、, B,但由于外部變量定 義的位置在函數(shù)main之后,因此本來在main函數(shù)中不能引用外部變 量A和B。現(xiàn)在我們在main函數(shù)的第2行用extern對(duì)A和B進(jìn)行“外 部變量聲明”, 表示A和B是已經(jīng)定義的外部變量(但定義的位置 在后面)。這樣在main函數(shù)中就可以合法地使用全局變量 A和B 了。 如果不作extern聲明,編譯時(shí)出錯(cuò),系統(tǒng)不會(huì)認(rèn)為A、B是已定義的 外部變量。一般做法是外部變量的定義放在引用它的所有函數(shù)之前, 這樣可以避免在函數(shù)中多加一個(gè)extern聲明。用extern聲明外部變量時(shí),類型名可以寫也可以省寫。例如上例中的“ extern int A; ”也可以寫成:“ exter

50、n A; ”。2.在多文件的程序中聲明外部變量一個(gè)C程序可以由一個(gè)或多個(gè)源程序文件組成。如果程序只由一個(gè)源 文件組成,使用外部變量的方法前面已經(jīng)介紹。 如果程序由多個(gè)源程 序文件組成,那么在一個(gè)文件中想引用另一個(gè)文件中已定義的外部變 量,有什么辦法呢?如果一個(gè)程序包含兩個(gè)文件,在兩個(gè)文件中都要用到同一個(gè)外部變量Num不能分別在兩個(gè)文件中各自定義一個(gè)外部 變量Num否則在進(jìn)行程序的連接時(shí)會(huì)出現(xiàn)“重復(fù)定義”的錯(cuò)誤。正確的做法是:在任一個(gè)文件中定義外部變量Num而在另一文件中 用extern對(duì)Num(乍“外部變量聲明”。即extern Num在編譯和連 接時(shí),系統(tǒng)會(huì)由此知道Num是一個(gè)已在別處定義的

51、外部變量, 并將在 另一文件中定義的外部變量的作用域擴(kuò)展到本文件,在本文件中可以 合法地引用外部變量Num下面舉一個(gè)簡單的例子來說明這種引用。例8.21用extern將外部變量的作用域擴(kuò)展到其他文件。本程序的作用是給定b的值,輸入a和m求axb和am的值文件filel . c中的內(nèi)容為:int A ; /*定義外部變量*/main ()int power (int ) ; /*對(duì)調(diào)用函數(shù)作聲明*/int b = 3, c, d, mprintf (e nter the nu mber a and its power m : n);seanf ( %d,% d,& A, & m ;c = A*b;printf ( %d* %d=% dn, A, b, e);d = power (m);printf ( % d* % d = % d, A, m d);文件file2 . e中的內(nèi)容為:ext

溫馨提示

  • 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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論