資源描述:
《指向結(jié)構(gòu)指針》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、指向結(jié)構(gòu)的指針為了進(jìn)一步說明指向結(jié)構(gòu)的指針和結(jié)構(gòu)數(shù)組,我們重新編寫關(guān)鍵字統(tǒng)計(jì)程序,這次采用指針,而不使用數(shù)組下標(biāo)。keytab的外部聲明不需要修改,但main和binsearch函數(shù)必須修改。修改后的程序如下:#include#include#include#defineMAXWORD100intgetword(char*,int);structkey*binsearch(char*,structkey*,int);/*countCkeywords;pointerversion*/main(){charword[MAX
2、WORD];structkey*p;while(getword(word,MAXWORD)!=EOF)if(isalpha(word[0]))if((p=binsearch(word,keytab,NKEYS))!=NULL)p->count++;for(p=keytab;pcount>0)printf("%4d%s",p->count,p->word);return0;}/*binsearch:findwordintab[0]...tab[n-1]*/structkey*binsearch(char*word,struc
3、kkey*tab,intn){intcond;structkey*low=&tab[0];structkey*high=&tab[n];structkey*mid;while(lowword))<0)high=mid;elseif(cond>0)low=mid+1;elsereturnmid;}returnNULL;}這里需要注意幾點(diǎn)。首先,binsearch函數(shù)在聲明中必須表明:它返回的值類型是一個指向structkey類型的指針,而非整型,這在函數(shù)原型及binse
4、arch函數(shù)中都要聲明。如果binsearch找到與輸入單詞匹配的數(shù)組元素,它將返回一個指向該元素的指針,否則返回NULL。其次,keytab的元素在這里是通過指針訪問的。這就需要對binsearch做較大的修改。在這里,low和high的初值分別是指向表頭元素的指針和指向表尾元素后面的一個元素的指針。這樣,我們就無法簡單地通過下列表達(dá)式計(jì)算中間元素的位置:mid=(low+high)/2/*WRONG*/這是因?yàn)椋瑑蓚€指針之間的加法運(yùn)算是非法的。但是,指針的減法運(yùn)算卻是合法的,high-low的值就是數(shù)組元素的個數(shù),因此,可以用下列表達(dá)式:mid=low+(high-lo
5、w)/2將mid設(shè)置為指向位于high和low之間的中間元素的指針。對算法的最重要修改在于,要確保不會生成非法的指針,或者是試圖訪問數(shù)組范圍之外的元素。問題在于,&tab[-1]和&tab[n]都超出了數(shù)組tab的范圍。前者是絕對非法的,而對后者的間接引用也是非法的。但是,C語言的定義保證數(shù)組末尾之后的第一個元素(即&tab[n])的指針?biāo)阈g(shù)運(yùn)算可以正確執(zhí)行。主程序main中有下列語句:for(p=keytab;p6、到結(jié)構(gòu)數(shù)組的下一個元素,這樣,上述測試條件便可以保證循環(huán)正確終止,但是,千萬不要認(rèn)為結(jié)構(gòu)的長度等于各成員長度的和。因?yàn)椴煌膶ο笥胁煌膶R要求,所以,結(jié)構(gòu)中可能會出現(xiàn)未命名的“空穴“(hole)。例如,假設(shè)char類型占用一個字節(jié),int類型占用4個字節(jié),則下列結(jié)構(gòu):struct{charc;inti;};可能需要8個字節(jié)的存儲空間,而不是5個字節(jié)。使用sizeof運(yùn)算符可以返回正確的對象長度。最后,說明一點(diǎn)程序的格式問題:當(dāng)函數(shù)的返回值類型比較復(fù)雜時(如結(jié)構(gòu)指針),例如structkey*binsearch(char*word,structkey*tab,intn)很難
7、看出函數(shù)名,也不太容易使用文本編輯器找到函數(shù)名。我們可以采用另一種格式書寫上述語句:structkey*binsearch(char*word,structkey*tab,intn)具體采用哪種寫法屬于個