![C語言多維數(shù)組與多級(jí)指針_第1頁](http://file4.renrendoc.com/view/64a13f5e901dbfd838e2680ec7995a8e/64a13f5e901dbfd838e2680ec7995a8e1.gif)
![C語言多維數(shù)組與多級(jí)指針_第2頁](http://file4.renrendoc.com/view/64a13f5e901dbfd838e2680ec7995a8e/64a13f5e901dbfd838e2680ec7995a8e2.gif)
![C語言多維數(shù)組與多級(jí)指針_第3頁](http://file4.renrendoc.com/view/64a13f5e901dbfd838e2680ec7995a8e/64a13f5e901dbfd838e2680ec7995a8e3.gif)
![C語言多維數(shù)組與多級(jí)指針_第4頁](http://file4.renrendoc.com/view/64a13f5e901dbfd838e2680ec7995a8e/64a13f5e901dbfd838e2680ec7995a8e4.gif)
![C語言多維數(shù)組與多級(jí)指針_第5頁](http://file4.renrendoc.com/view/64a13f5e901dbfd838e2680ec7995a8e/64a13f5e901dbfd838e2680ec7995a8e5.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C語言多維數(shù)組與多級(jí)指針多維數(shù)組與多級(jí)指針也是初學(xué)者感覺迷糊的一個(gè)地方。超過二維的數(shù)組和超過二 級(jí)的指針其實(shí)并不多用。如果能弄明白二維數(shù)組與二級(jí)指針,那二維以上的也不 是什么問題了。所以本節(jié)重點(diǎn)討論二維數(shù)組與二級(jí)指針。一、二維數(shù)組1、假想中的二維數(shù)組布局我們前面討論過,數(shù)組里面可以存任何數(shù)據(jù),除了函數(shù)。下面就詳細(xì)討論討論數(shù) 組里面存數(shù)組的情況。Excel表,我相信大家都見過。我們平時(shí)就可以把二維數(shù) 組假想成一個(gè)excel表,比如: char a34;2、內(nèi)存與尺子的對(duì)比實(shí)際上內(nèi)存不是表狀的,而是線性的。見過尺子吧?尺子和我們的內(nèi)存非常相似。 一般尺子上最小刻度為毫米,而內(nèi)存的最小單位為1個(gè)by
2、te。平時(shí)我們說32毫 米,是指以零開始偏移32毫米;平時(shí)我們說內(nèi)存地址為0X0000FF00也是指從 內(nèi)存零地址開始偏移0X0000FF00個(gè)byte。既然內(nèi)存是線性的,那二維數(shù)組在內(nèi) 存里面肯定也是線性存儲(chǔ)的。實(shí)際上其內(nèi)存布局如下圖:以數(shù)組下標(biāo)的方式來訪問其中的某個(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類型的元素,其每個(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)過上面的講解,相信你已經(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);問打印出來的結(jié)果是多少?很多人都覺得這太簡(jiǎn)單了,很快就能把答案告訴我:0。不過很可惜,錯(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)寫成小 括號(hào)
5、了。3、&p42 - &a42的值為多少?上面的問題似乎還比較好理解,下面再看一個(gè)例子:int a55;int (*p)4;p = a;問&p42 - &a42的值為多少?這個(gè)問題似乎非常簡(jiǎn)單,但是幾乎沒有人答對(duì)了。我們可以先寫代碼測(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)過測(cè)試,可知&p42 - &a42的
6、值為-4。這到底是為什么呢?下面我們 就來分析一下:前面我們講過,當(dāng)數(shù)組名a作為右值時(shí),代表的是數(shù)組首元素 的首地址。這里的a為二維數(shù)組,我們把數(shù)組a看作是包含5個(gè)int類型元素 的一維數(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ù)組的指針。也就是說p+1表示的是 指針p向后移動(dòng)了一個(gè)“包含4個(gè)int類型元素的數(shù)組”。這里1的單位是
7、p 所指向的空間,即4*sizeof(int)。所以,p4相對(duì)于p0來說是向后移動(dòng)了 4 個(gè)“包含4個(gè)int類型元素的數(shù)組”,咪p4表示的是&p0+4*4*sizeof(int)。由于p被初始化為&a0,那么&p42表示的是 &a00+4*4*sizeof(int)+2* sizeof(int)。再由上面的講述,&p42和&a42的值相差4個(gè)int類型的元素?,F(xiàn)在, 上面測(cè)試出來的結(jié)果也可以理解了吧?其實(shí)我們最簡(jiǎn)單的辦法就是畫內(nèi)存布局 圖:這里最重要的一點(diǎn)就是明白數(shù)組指針p所指向的內(nèi)存到底是什么。解決這類問 題的最好辦法就是畫內(nèi)存布局圖。二、二級(jí)指針1、二級(jí)指針的內(nèi)存布局二級(jí)指針是經(jīng)常用到的,
8、尤其與二維數(shù)組在一起的時(shí)候更是令人迷糊。例如: char *p;定義了一個(gè)二級(jí)指針變量pp是一個(gè)指針變量,毫無疑問在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í)指針也不例外。也就是說把指針指向數(shù)組的零地址。聯(lián)想到前面我們把尺子 比作內(nèi)存,如果把內(nèi)存初始化為NULL,就相當(dāng)于把指針指向尺子上0毫米處, 這時(shí)候指針沒有任何內(nèi)存可用。當(dāng)我們真正需要使用p的時(shí)候,就必須把一個(gè)一級(jí)指針的地址保存到p中,所 以B)的賦值方式也是正確的。給p賦值沒有問題,但怎么使用p呢?這就需要我們前面多次提到的鑰匙 (“*”)。第一步:根據(jù)p這個(gè)變量,取出它里面存的地址。第二步:找到這個(gè)地址所在的內(nèi)存。第三步:用鑰匙打開這塊內(nèi)存,取出它里面的地址,*p的值。第四步:找到第二次取出的這個(gè)地址。第五步:用鑰匙打開這塊內(nèi)存,取出它里面的內(nèi)容,這就是我們真正的數(shù)據(jù),*p 的值。我們?cè)谶@里
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度國產(chǎn)打印機(jī)節(jié)能環(huán)保認(rèn)證采購合同
- 重慶2025年重慶市北碚區(qū)基層醫(yī)療衛(wèi)生事業(yè)單位招聘14人筆試歷年參考題庫附帶答案詳解
- 酒泉2025年甘肅酒泉市公安局招聘留置看護(hù)崗位輔警60人筆試歷年參考題庫附帶答案詳解
- 貴州2025年貴州省文化和旅游廳直屬事業(yè)單位招聘12人筆試歷年參考題庫附帶答案詳解
- 玉林2025年廣西玉林市第一人民醫(yī)院招聘24人筆試歷年參考題庫附帶答案詳解
- 漯河2024年河南漯河市立醫(yī)院(漯河市骨科醫(yī)院漯河醫(yī)專二附院)招聘高層次人才筆試歷年參考題庫附帶答案詳解
- ??诤D虾?谑协偵絽^(qū)教育局招聘2025屆師范畢業(yè)生筆試歷年參考題庫附帶答案詳解
- 河北2024年中國工商銀行河北分行鄉(xiāng)村振興專項(xiàng)招聘20人筆試歷年參考題庫附帶答案詳解
- 2025年中國太陽能十字路口單黃閃警示燈市場(chǎng)調(diào)查研究報(bào)告
- 2025年艾納素項(xiàng)目可行性研究報(bào)告
- 光纜線路施工安全協(xié)議書范本
- 成本合約規(guī)劃培訓(xùn)
- 山東省濟(jì)寧市2025屆高三歷史一輪復(fù)習(xí)高考仿真試卷 含答案
- 五年級(jí)數(shù)學(xué)(小數(shù)乘法)計(jì)算題專項(xiàng)練習(xí)及答案
- 交通法規(guī)教育課件
- 產(chǎn)前診斷室護(hù)理工作總結(jié)
- 6S管理知識(shí)培訓(xùn)課件
- 小學(xué)校長任期五年工作目標(biāo)(2024年-2029年)
- 醫(yī)院培訓(xùn)課件:《猴痘流行病學(xué)特點(diǎn)及中國大陸首例猴痘病例調(diào)查處置》
- 氫氣-安全技術(shù)說明書MSDS
- 產(chǎn)科護(hù)士臨床思維能力培養(yǎng)
評(píng)論
0/150
提交評(píng)論