C語(yǔ)言多維數(shù)組與多級(jí)指針_第1頁(yè)
C語(yǔ)言多維數(shù)組與多級(jí)指針_第2頁(yè)
C語(yǔ)言多維數(shù)組與多級(jí)指針_第3頁(yè)
C語(yǔ)言多維數(shù)組與多級(jí)指針_第4頁(yè)
C語(yǔ)言多維數(shù)組與多級(jí)指針_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、C語(yǔ)言多維數(shù)組與多級(jí)指針多維數(shù)組與多級(jí)指針也是初學(xué)者感覺(jué)迷糊的一個(gè)地方。超過(guò)二維的數(shù)組和超過(guò)二 級(jí)的指針其實(shí)并不多用。如果能弄明白二維數(shù)組與二級(jí)指針,那二維以上的也不 是什么問(wèn)題了。所以本節(jié)重點(diǎn)討論二維數(shù)組與二級(jí)指針。一、二維數(shù)組1、假想中的二維數(shù)組布局我們前面討論過(guò),數(shù)組里面可以存任何數(shù)據(jù),除了函數(shù)。下面就詳細(xì)討論討論數(shù) 組里面存數(shù)組的情況。Excel表,我相信大家都見(jiàn)過(guò)。我們平時(shí)就可以把二維數(shù) 組假想成一個(gè)excel表,比如: char a34;2、內(nèi)存與尺子的對(duì)比實(shí)際上內(nèi)存不是表狀的,而是線性的。見(jiàn)過(guò)尺子吧?尺子和我們的內(nèi)存非常相似。 一般尺子上最小刻度為毫米,而內(nèi)存的最小單位為1個(gè)by

2、te。平時(shí)我們說(shuō)32毫 米,是指以零開(kāi)始偏移32毫米;平時(shí)我們說(shuō)內(nèi)存地址為0X0000FF00也是指從 內(nèi)存零地址開(kāi)始偏移0X0000FF00個(gè)byte。既然內(nèi)存是線性的,那二維數(shù)組在內(nèi) 存里面肯定也是線性存儲(chǔ)的。實(shí)際上其內(nèi)存布局如下圖:以數(shù)組下標(biāo)的方式來(lái)訪問(wèn)其中的某個(gè)元素:aij。編譯器總是將二維數(shù)組看 成是一個(gè)一維數(shù)組,而一維數(shù)組的每一個(gè)元素又都是一個(gè)數(shù)組。a3這個(gè)一維數(shù) 組的三個(gè)元素分別為:a0,a1,a2。每個(gè)元素的大小為 sizeof (a0),即 sizof(char)*4。由此 可以計(jì)算出a0,a1,a2三個(gè)元素的首地址分別為& a0,& a0 + 1*sizof(char)*4

3、, & a0+ 2*sizof(char)*4。亦即 ai的首地址為& a0 + i*sizof(char)*4。這時(shí)候再考慮ai里面的內(nèi)容。就本例而言,ai內(nèi)有4個(gè) char類(lèi)型的元素,其每個(gè)元素的首地址分別為&ai,&ai+1*sizof(char), &ai+2*sizof(char)&ai+3*sizof(char),即 aij的首地址為 &ai+j*sizof(char)。再把&ai的值用a表示,得到aij元素的首地址為: a+ i*sizof(char)*4+ j*sizof(char)。同樣,可以換算成以指針的形式表示: *(*(a+i)+j)。經(jīng)過(guò)上面的講解,相信你已經(jīng)掌握了二

4、維數(shù)組在內(nèi)存里面的布局了。下面就看一 個(gè)題:#include intmain(int argc,char * argv)(int a 32 = (0,1),(2,3),(4,5);int *p;p=a 0;printf(d,p0);問(wèn)打印出來(lái)的結(jié)果是多少?很多人都覺(jué)得這太簡(jiǎn)單了,很快就能把答案告訴我:0。不過(guò)很可惜,錯(cuò)了。答 案應(yīng)該是1。如果你也認(rèn)為是0,那你實(shí)在應(yīng)該好好看看這個(gè)題?;ɡㄌ?hào)里面嵌 套的是小括號(hào),而不是花括號(hào)!這里是花括號(hào)里面嵌套了逗號(hào)表達(dá)式!其實(shí)這個(gè) 賦值就相當(dāng)于int a 32 = ( 1, 3,5;所以,在初始化二維數(shù)組的時(shí)候一定要注意,別不小心把應(yīng)該用的花括號(hào)寫(xiě)成小 括號(hào)

5、了。3、&p42 - &a42的值為多少?上面的問(wèn)題似乎還比較好理解,下面再看一個(gè)例子:int a55;int (*p)4;p = a;問(wèn)&p42 - &a42的值為多少?這個(gè)問(wèn)題似乎非常簡(jiǎn)單,但是幾乎沒(méi)有人答對(duì)了。我們可以先寫(xiě)代碼測(cè)試一下其 值,然后分析一下到底是為什么。在Visual C+6.0里,測(cè)試代碼如下: intmain()(int a55;int (*p)4;p = a;printf(a_ptr=%#p,p_ptr=%#pn,&a42,&p42);printf(%p,%dn,&p42 - &a42,&p42 - &a42);return 0;經(jīng)過(guò)測(cè)試,可知&p42 - &a42的

6、值為-4。這到底是為什么呢?下面我們 就來(lái)分析一下:前面我們講過(guò),當(dāng)數(shù)組名a作為右值時(shí),代表的是數(shù)組首元素 的首地址。這里的a為二維數(shù)組,我們把數(shù)組a看作是包含5個(gè)int類(lèi)型元素 的一維數(shù)組,里面再存儲(chǔ)了一個(gè)一維數(shù)組。如此,則a在這里代表的是a0的首地址。a+1表示的是一維數(shù)組a的第二個(gè) 元素。a4表示的是一維數(shù)組a的第5個(gè)元素,而這個(gè)元素里又存了一個(gè)一維 數(shù)組。所以&a42表示的是&a00+4*5*sizeof(int) + 2*sizeof(int)。根據(jù)定義,p是指向一個(gè)包含4個(gè)元素的數(shù)組的指針。也就是說(shuō)p+1表示的是 指針p向后移動(dòng)了一個(gè)“包含4個(gè)int類(lèi)型元素的數(shù)組”。這里1的單位是

7、p 所指向的空間,即4*sizeof(int)。所以,p4相對(duì)于p0來(lái)說(shuō)是向后移動(dòng)了 4 個(gè)“包含4個(gè)int類(lèi)型元素的數(shù)組”,咪p4表示的是&p0+4*4*sizeof(int)。由于p被初始化為&a0,那么&p42表示的是 &a00+4*4*sizeof(int)+2* sizeof(int)。再由上面的講述,&p42和&a42的值相差4個(gè)int類(lèi)型的元素?,F(xiàn)在, 上面測(cè)試出來(lái)的結(jié)果也可以理解了吧?其實(shí)我們最簡(jiǎn)單的辦法就是畫(huà)內(nèi)存布局 圖:這里最重要的一點(diǎn)就是明白數(shù)組指針p所指向的內(nèi)存到底是什么。解決這類(lèi)問(wèn) 題的最好辦法就是畫(huà)內(nèi)存布局圖。二、二級(jí)指針1、二級(jí)指針的內(nèi)存布局二級(jí)指針是經(jīng)常用到的,

8、尤其與二維數(shù)組在一起的時(shí)候更是令人迷糊。例如: char *p;定義了一個(gè)二級(jí)指針變量pp是一個(gè)指針變量,毫無(wú)疑問(wèn)在32位系統(tǒng)下占4個(gè) byte。它與一級(jí)指針不同的是,一級(jí)指針保存的是數(shù)據(jù)的地址,二級(jí)指針保存的是一級(jí) 指針的地址。下圖幫助理解:我們?cè)囍o變量p初始化:A)p = NULL;B)char *p2; p = &p2;任何指針變量都可以被初始化為NULL(注意是NULL,不是NUL,更不是null), 二級(jí)指針也不例外。也就是說(shuō)把指針指向數(shù)組的零地址。聯(lián)想到前面我們把尺子 比作內(nèi)存,如果把內(nèi)存初始化為NULL,就相當(dāng)于把指針指向尺子上0毫米處, 這時(shí)候指針沒(méi)有任何內(nèi)存可用。當(dāng)我們真正需要使用p的時(shí)候,就必須把一個(gè)一級(jí)指針的地址保存到p中,所 以B)的賦值方式也是正確的。給p賦值沒(méi)有問(wèn)題,但怎么使用p呢?這就需要我們前面多次提到的鑰匙 (“*”)。第一步:根據(jù)p這個(gè)變量,取出它里面存的地址。第二步:找到這個(gè)地址所在的內(nèi)存。第三步:用鑰匙打開(kāi)這塊內(nèi)存,取出它里面的地址,*p的值。第四步:找到第二次取出的這個(gè)地址。第五步:用鑰匙打開(kāi)這塊內(nèi)存,取出它里面的內(nèi)容,這就是我們真正的數(shù)據(jù),*p 的值。我們?cè)谶@里

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論