




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、C語言多維數組與多級指針多維數組與多級指針也是初學者感覺迷糊的一個地方。超過二維的數組和超過二 級的指針其實并不多用。如果能弄明白二維數組與二級指針,那二維以上的也不 是什么問題了。所以本節重點討論二維數組與二級指針。一、二維數組1、假想中的二維數組布局我們前面討論過,數組里面可以存任何數據,除了函數。下面就詳細討論討論數 組里面存數組的情況。Excel表,我相信大家都見過。我們平時就可以把二維數 組假想成一個excel表,比如: char a34;2、內存與尺子的對比實際上內存不是表狀的,而是線性的。見過尺子吧?尺子和我們的內存非常相似。 一般尺子上最小刻度為毫米,而內存的最小單位為1個by
2、te。平時我們說32毫 米,是指以零開始偏移32毫米;平時我們說內存地址為0X0000FF00也是指從 內存零地址開始偏移0X0000FF00個byte。既然內存是線性的,那二維數組在內 存里面肯定也是線性存儲的。實際上其內存布局如下圖:以數組下標的方式來訪問其中的某個元素:aij。編譯器總是將二維數組看 成是一個一維數組,而一維數組的每一個元素又都是一個數組。a3這個一維數 組的三個元素分別為:a0,a1,a2。每個元素的大小為 sizeof (a0),即 sizof(char)*4。由此 可以計算出a0,a1,a2三個元素的首地址分別為& a0,& a0 + 1*sizof(char)*4
3、, & a0+ 2*sizof(char)*4。亦即 ai的首地址為& a0 + i*sizof(char)*4。這時候再考慮ai里面的內容。就本例而言,ai內有4個 char類型的元素,其每個元素的首地址分別為&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)。經過上面的講解,相信你已經掌握了二
4、維數組在內存里面的布局了。下面就看一 個題:#include intmain(int argc,char * argv)(int a 32 = (0,1),(2,3),(4,5);int *p;p=a 0;printf(d,p0);問打印出來的結果是多少?很多人都覺得這太簡單了,很快就能把答案告訴我:0。不過很可惜,錯了。答 案應該是1。如果你也認為是0,那你實在應該好好看看這個題。花括號里面嵌 套的是小括號,而不是花括號!這里是花括號里面嵌套了逗號表達式!其實這個 賦值就相當于int a 32 = ( 1, 3,5;所以,在初始化二維數組的時候一定要注意,別不小心把應該用的花括號寫成小 括號
5、了。3、&p42 - &a42的值為多少?上面的問題似乎還比較好理解,下面再看一個例子:int a55;int (*p)4;p = a;問&p42 - &a42的值為多少?這個問題似乎非常簡單,但是幾乎沒有人答對了。我們可以先寫代碼測試一下其 值,然后分析一下到底是為什么。在Visual C+6.0里,測試代碼如下: 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;經過測試,可知&p42 - &a42的
6、值為-4。這到底是為什么呢?下面我們 就來分析一下:前面我們講過,當數組名a作為右值時,代表的是數組首元素 的首地址。這里的a為二維數組,我們把數組a看作是包含5個int類型元素 的一維數組,里面再存儲了一個一維數組。如此,則a在這里代表的是a0的首地址。a+1表示的是一維數組a的第二個 元素。a4表示的是一維數組a的第5個元素,而這個元素里又存了一個一維 數組。所以&a42表示的是&a00+4*5*sizeof(int) + 2*sizeof(int)。根據定義,p是指向一個包含4個元素的數組的指針。也就是說p+1表示的是 指針p向后移動了一個“包含4個int類型元素的數組”。這里1的單位是
7、p 所指向的空間,即4*sizeof(int)。所以,p4相對于p0來說是向后移動了 4 個“包含4個int類型元素的數組”,咪p4表示的是&p0+4*4*sizeof(int)。由于p被初始化為&a0,那么&p42表示的是 &a00+4*4*sizeof(int)+2* sizeof(int)。再由上面的講述,&p42和&a42的值相差4個int類型的元素。現在, 上面測試出來的結果也可以理解了吧?其實我們最簡單的辦法就是畫內存布局 圖:這里最重要的一點就是明白數組指針p所指向的內存到底是什么。解決這類問 題的最好辦法就是畫內存布局圖。二、二級指針1、二級指針的內存布局二級指針是經常用到的,
8、尤其與二維數組在一起的時候更是令人迷糊。例如: char *p;定義了一個二級指針變量pp是一個指針變量,毫無疑問在32位系統下占4個 byte。它與一級指針不同的是,一級指針保存的是數據的地址,二級指針保存的是一級 指針的地址。下圖幫助理解:我們試著給變量p初始化:A)p = NULL;B)char *p2; p = &p2;任何指針變量都可以被初始化為NULL(注意是NULL,不是NUL,更不是null), 二級指針也不例外。也就是說把指針指向數組的零地址。聯想到前面我們把尺子 比作內存,如果把內存初始化為NULL,就相當于把指針指向尺子上0毫米處, 這時候指針沒有任何內存可用。當我們真正需要使用p的時候,就必須把一個一級指針的地址保存到p中,所 以B)的賦值方式也是正確的。給p賦值沒有問題,但怎么使用p呢?這就需要我們前面多次提到的鑰匙 (“*”)。第一步:根據p這個變量,取出它里面存的地址。第二步:找到這個地址所在的內存。第三步:用鑰匙打開這塊內存,取出它里面的地址,*p的值。第四步:找到第二次取出的這個地址。第五步:用鑰匙打開這塊內存,取出它里面的內容,這就是我們真正的數據,*p 的值。我們在這里
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西省宜春重點中學2022-2023學年聯考高二下學期語文期末試卷(含答案)
- 北京市西城區2023-2024學年五年級下學期語文期末試卷(含答案)
- 2025護工與老年人直接雇傭合同
- 2025合同法制的創新與發展趨勢
- 2025中介租賃合同書范本
- 2025年科技創業前如何精準簽訂技術轉讓合同
- 2025年深圳市租房租賃合同簡易模板
- 2025年合作伙伴間的合同范本
- 2025鋁材買賣合同模板范本
- 《中國股市發展歷程》課件
- 2025屆上海市浦東新區高三二模英語試卷(含答案)
- 開曼群島公司法2024版中文譯本(含2024年修訂主要內容)
- 【MOOC】航空燃氣渦輪發動機結構設計-北京航空航天大學 中國大學慕課MOOC答案
- 悅己人生-大學生心理健康智慧樹知到期末考試答案章節答案2024年哈爾濱工業大學
- 職業衛生評價考試計算題匯總
- JJF 1318-2011 影像測量儀校準規范-(高清現行)
- 沉井工程施工綜合方案
- 產品開發控制程序
- 沖壓作業指導書模板
- MAPGIS使用手冊
- 員工工作調動單
評論
0/150
提交評論