為什么要用指針?
假設(shè)您想制作一個(gè)文本編輯器——一種用于編輯普通ASCII文本文件的程序,如UNIX上的“vi”或Windows上的“記事本”。文本編輯器是很常用的軟件,因?yàn)榭上攵鼛缀跏浅绦騿T使用最多的程序了。通過(guò)文本編輯器程序員才能和計(jì)算機(jī)“親密接觸”——您使用它輸入并實(shí)現(xiàn)自己的創(chuàng)意。對(duì)于這么一個(gè)使用如此頻繁又如此親近的程序,您自然希望它是完美無(wú)缺的。于是許多程序員自己制作文本編輯器并進(jìn)行定制,以適合個(gè)人的工作方式和偏好。
現(xiàn)在您要制作自己的編輯器了。考慮過(guò)所需的功能后,您開(kāi)始思考編輯器使用的“數(shù)據(jù)結(jié)構(gòu)”,即在內(nèi)存中如何組織文件以供程序進(jìn)行操作。您需要的是一種便于對(duì)輸入信息進(jìn)行簡(jiǎn)單快捷操作的存儲(chǔ)方式。您確信將字符按行存儲(chǔ)是一種可行的方法。根據(jù)前面學(xué)到的知識(shí),現(xiàn)在可用的只有數(shù)組。您想:“一行一般是80個(gè)字符,一個(gè)文件一般不會(huì)超過(guò)1,000行。”于是您聲明了一個(gè)二維數(shù)組,像這樣:
char doc[1000][80];
此聲明要求分配的數(shù)組有1,000行,每行80個(gè)字符。數(shù)組的規(guī)模是80,000個(gè)字符。
然而,當(dāng)您對(duì)編輯器和它使用的數(shù)據(jù)結(jié)構(gòu)進(jìn)行了一些深入思考后,還會(huì)認(rèn)識(shí)到下面三點(diǎn):
假如您設(shè)定最多可以同時(shí)打開(kāi)10個(gè)文件,每行最多1,000個(gè)字符,每個(gè)文件最多50,000行。這時(shí)的聲明就變成了:
char doc[50000][1000][10];
似乎看起來(lái)并不過(guò)分,可是您拿出計(jì)算器算一下50,000乘1,000乘10 就會(huì)發(fā)現(xiàn)數(shù)組包含了5億個(gè)字符!如今的大多數(shù)計(jì)算機(jī)遇到這么大的數(shù)組的都會(huì)出問(wèn)題。它們根本沒(méi)有足夠的RAM甚至虛擬內(nèi)存空間來(lái)容納這么龐大數(shù)組。即使是在最大的多用戶系統(tǒng)上,如果多個(gè)用戶要同時(shí)運(yùn)行三四個(gè)這種編輯器程序的話,對(duì)系統(tǒng)也會(huì)造成嚴(yán)重的負(fù)擔(dān)。
即使計(jì)算機(jī)可以承受這么大規(guī)模的數(shù)組,您也能看出這是對(duì)存儲(chǔ)空間的巨大浪費(fèi)。如果編輯器聲明了一個(gè)5億字符大小的數(shù)組,而絕大多數(shù)情況下打開(kāi)的只是百行左右、四五千字節(jié)的文件的話,那么這確實(shí)是有些不合情理的。使用數(shù)組的一個(gè)問(wèn)題是必須在開(kāi)始就將它的每一維都聲明成最大值,而各維最大值的乘積常常是一個(gè)非常大的數(shù)字。不僅如此,您如果需要編輯一個(gè)有2,000個(gè)字符的行的文件的話,又只能是無(wú)計(jì)可施了。其實(shí),事先預(yù)計(jì)并處理文本文件每行的最大長(zhǎng)度是不可能的,因?yàn)閲?yán)格說(shuō)來(lái)這一長(zhǎng)度是無(wú)限的。
指針正好可以用來(lái)解決這個(gè)難題。使用指針您能夠創(chuàng)建動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。這時(shí)內(nèi)存將在程序運(yùn)行的時(shí)候從堆上分配,而不用一開(kāi)始就聲明數(shù)組的最大規(guī)模。這樣您就可以為每個(gè)文檔準(zhǔn)確地分配內(nèi)存而不會(huì)產(chǎn)生浪費(fèi)。而且,關(guān)閉一個(gè)文檔時(shí)您還可以把它占用的內(nèi)存返回給堆,以供程序的其他部分使用。使用指針,內(nèi)存就可以在程序運(yùn)行期間不斷被回收利用。
順便說(shuō)一句,如果您讀了上面的討論后頭腦中的一大疑惑是:“到底什么是字節(jié)呢?”,那么位和字節(jié)的原理這篇文章將有助于您理解相關(guān)的概念,包括“兆”、“吉”、“太”等等。請(qǐng)閱讀那篇文章后再回來(lái)繼續(xù)學(xué)習(xí)。
聯(lián)系客服