C語言中數(shù)組和指針之間的互操作.doc_第1頁
C語言中數(shù)組和指針之間的互操作.doc_第2頁
C語言中數(shù)組和指針之間的互操作.doc_第3頁
C語言中數(shù)組和指針之間的互操作.doc_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

我曾說過,在C語言中只有一維的數(shù)組(這是我對(duì)數(shù)組的看法),而且數(shù)組元素可以是任何類型的數(shù)據(jù)(或?qū)ο螅?,自然也可以是另外的一個(gè)數(shù)組(因?yàn)閿?shù) 組也是一種數(shù)據(jù)類型)。所以如果你堅(jiān)持要說有多維數(shù)組,那也不是不可能的事情。我們只要把一個(gè)數(shù)組賦值給另一個(gè)數(shù)組的元素就可以了。當(dāng)然了,我們必須保證 在程序編譯期數(shù)組的大小是一個(gè)固定的常數(shù)。 其實(shí),數(shù)組的操作很簡單的。只要我們確定一個(gè)數(shù)組的大小和指向該數(shù)組下標(biāo)為0的元素的指針,其他的任何一個(gè)數(shù)組下標(biāo)的運(yùn)算都等同于一個(gè)對(duì)應(yīng)的指針運(yùn) 算,所以我們說“數(shù)組和指針是可以相互操作的”。兩者的本質(zhì)是一樣的。甚至我們還可以把數(shù)組看作是一個(gè)“指針”的集合。 我可以通過如下的方式聲明一個(gè)數(shù)組: char name10; 這個(gè)語句聲明了name是一個(gè)擁有10個(gè)字符型元素的數(shù)組。類似的 strUCt student int tid4; char name10; char sex; char address25; std100; 這里聲明了std是一個(gè)擁有100個(gè)元素的數(shù)組,而且std中的每一個(gè)元素都定義了一名學(xué)生的基本信息,每一個(gè)元素都是一個(gè)結(jié)構(gòu),其中包括一個(gè)擁有4 個(gè)整形元素的數(shù)組(tid4),用來記錄學(xué)生的學(xué)好;還有一個(gè)擁有10個(gè)字符型元素的數(shù)組(name10),用來記錄學(xué)生的名字;一個(gè)用來記錄學(xué) 生性別的字符(sex);還有一個(gè)記錄學(xué)生住址,擁有25個(gè)字符型元素的數(shù)組(address25)。數(shù)組是一個(gè)很靈活的結(jié)構(gòu)。 所謂的“二維數(shù)組”或“矩陣”是很容易聲明的,例如: int week724; 這里把聲明week聲明為一個(gè)擁有7個(gè)數(shù)組元素的數(shù)組(這樣解釋,不會(huì)感覺奇觀吧),其中每一個(gè)元素都是擁有24個(gè)整數(shù)型元素的數(shù)組。注意了不能把 week理解為一個(gè)擁有24個(gè)數(shù)組元素的數(shù)組,其中每一個(gè)元素是一個(gè)擁有7個(gè)整形元素的數(shù)組。 還有,如果week不是用于sizeof的操作數(shù),那么它總是被一個(gè)指向week數(shù)組起始地址的指針。這里又和指針磨合了。 如果一個(gè)指向的是一個(gè)數(shù)組的一個(gè)元素,那么我們只需給這個(gè)指針加上一個(gè)自然數(shù)i(0 =i 數(shù)組的上邊界的值),那么就可以得到一個(gè)指向該數(shù)組的弟i個(gè)元素的指針。如果在此基礎(chǔ)上減去1,那么就得到了一個(gè)指向前一個(gè)元素的指針。這樣的操 作很簡單很靈活的。但是這兒也有一個(gè)誤區(qū):好多人都認(rèn)為“給一個(gè)指針加一個(gè)整數(shù),就等同于給該指針的二進(jìn)制數(shù)表示加上一個(gè)同樣的整數(shù)”。其實(shí),這是一個(gè)很 容易犯的錯(cuò)誤了,至少在初學(xué)C語言的時(shí)候,我就犯過這個(gè)錯(cuò)誤,而且不僅一次。其實(shí),這兩者的含義是截然不同的。假設(shè)我們有一個(gè)這樣的指針聲明語句: int *p; 那么p自然是一個(gè)指向整數(shù)指針了,那么p+1指向的是計(jì)算機(jī)內(nèi)存的下一個(gè)整數(shù),而不是指向指向地址的下一個(gè)內(nèi)存位置。也就是說程序的邏輯地址一般都不同于實(shí)際的物理地址。 如果有兩個(gè)指向同一個(gè)數(shù)組的元素,那么我們可以通過這兩個(gè)指針之間的算術(shù)運(yùn)算得到一些有意義的表達(dá)式。 比如, int *pointer; int *ip = pointer + i; 那么我們可以通過指ip-pointer得到i的值。如果ip和ponter指向的不是同一個(gè)元素,那么我們就無法保證這個(gè)操作的正確性,雖然他們?cè)趦?nèi)存地址上相差一個(gè)整數(shù)倍。 讓我們通過下面的一個(gè)例子來看看數(shù)組和指針操作的等效性和靈活度: 如果我們?cè)诔绦蛑新暶髁艘韵聝蓚€(gè)語句, int a12; int *p; 那么我們可以對(duì)數(shù)組和指針進(jìn)行相應(yīng)的操作了: (1) p = a; 因?yàn)閍 a0,所以這里就有p=a0了,即p和a都指向數(shù)組的第一個(gè)元素; (2) p = p + 1; 這也是正確的。它等效于p = a1; (3) p+; 這個(gè)語句等效于 p = a2; 還有: p = &a; 這樣的語句ANSI C中是錯(cuò)誤的,這一點(diǎn)在前一篇文章我已經(jīng)聲明過,因?yàn)檫@兩個(gè)操作數(shù)的類型很顯然是不匹配的,即&a是一個(gè)指向數(shù)組的指針而p是一個(gè)整型指針。所以 此類操作是非法的。有時(shí)可能會(huì)僥幸的通過(因?yàn)橛行┚幾g器提供商不一定嚴(yán)格的按照ANSI C的保準(zhǔn)來開發(fā)自己的編譯器),但是我們不提倡這種做法。 數(shù)組元素的引用 這是一個(gè)足夠讓人糊涂的問題。先看一看下面這個(gè)語句是否正確: a + i = a + i; 也許你會(huì)說很顯然是正確的,因?yàn)樗貏e象一個(gè)兩元加法運(yùn)算。雖然答案的前一半是正確的,但是問題的實(shí)質(zhì)可不是這樣的。為了回答之一個(gè) 問題我們需要從數(shù)組元素的引用說起。 在前面我們聲明了a為一個(gè)擁有12個(gè)整型元素的數(shù)組,而且我們知道a是一個(gè)指向該數(shù)組的第一個(gè)(0位元素)元素的指針,所以按照指針的性質(zhì)我們可以知道*a就是對(duì)數(shù)組的第一個(gè)元素的引用。你可以通過如下的方式給數(shù)組的第一個(gè)元素賦值: *a = 2005; 明白了這一點(diǎn),那么其他元素的賦值和引用也是類似的。*(a+3)是對(duì)數(shù)組的弟3個(gè)元素的引用,而其賦值可以是: *(a+3) = 2006; 然而,由加法的交換律,可以知道1+a = a+1,所以a+i = i+a; 因?yàn)?*(a+i) = *(i+a)。 現(xiàn)在讓我們想一想如何用指針來操作我們的二維數(shù)組吧。 前面我們聲明了一個(gè)二維數(shù)組week,那么week2代表什么意思呢?我想如果明白了前面的講解,那么這個(gè)問題就一如反掌了。week2代表 的無非就是week數(shù)組的弟3個(gè)元素(數(shù)組下標(biāo)從0開始),即一個(gè)擁有24個(gè)整型元素的數(shù)組。如果你還想知道week2的內(nèi)存大小,那么你可以通過 sizeof操作來實(shí)現(xiàn): int mem; mem = sizeof(week2); 其實(shí),sizeof(week2) = 24 * sozeof(int)。 如果你想通過指針來訪問week2的元素(這里假設(shè)訪問弟3個(gè)元素),那也是很簡單的。請(qǐng)看下面的表達(dá)式: int value; p = week3; value = *(p+3); 也可以是: value = week22; 或者 value = *(week2+3); 還可以是: value = *(*(week+2)+3); 由此我們可以看出來,數(shù)組和指針不是兩個(gè)相互獨(dú)立的結(jié)構(gòu),而是緊密緊密互不可分的整體。兩者之間的互操作是最美的結(jié)合。我們提倡只在程序設(shè)計(jì)中才用數(shù) 組和指針之間的互操作的實(shí)現(xiàn)方法。到這里我們的旅

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論