版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、前幾日用C編寫DSP程序時,遇到一個問題:如何向C函數(shù)中傳遞指向二維數(shù)組的指針參數(shù)。初接觸以為很簡單,直接聲明一個二維數(shù)組,然后把數(shù)組名傳進去。但是一經編譯便報錯。后來仔細想了一下,并查找了一些相關資料,發(fā)現(xiàn)二維數(shù)組在概念上遠比一維數(shù)組復雜,或者說二維數(shù)組以一種晦澀的方式構建在一維數(shù)組之上。 先來回顧一下一維數(shù)組。一維數(shù)組的數(shù)組名即為指向該數(shù)組的指針,該指針值保存了數(shù)組存放在內存中的一塊連續(xù)區(qū)域的起始地址;數(shù)組的下標表示了這片內存區(qū)域的某存儲區(qū)相對于起始地址的偏移量。簡單來講就是:指向一維數(shù)組的指針,指向數(shù)據存放區(qū)域的起始位置。 事實上,計算機系統(tǒng)的多維數(shù)組其實最終還是以一維數(shù)組的形式實現(xiàn)的。
2、就N x M的二維數(shù)組來講,設其數(shù)組名為array。指針array指向一個數(shù)組,該數(shù)組存放的是一系列指針,這些指針分別指向相應的一維數(shù)組,而這些數(shù)組中存放的才是我們的數(shù)據。 array -> 一維數(shù)組指針1 -> 一維數(shù)組,M長 一維數(shù)組指針2 -> 一維數(shù)組,M長 一維數(shù)組指針N -> 一維數(shù)組,M長 由此array是第i個指針變量地址,array
3、j則表示相對于第i個指針變量偏移j*sizeof(數(shù)組類型)。系統(tǒng)通過這種機制訪問了該二維數(shù)組的第i行,第j列的內容。 有上述可知,指向二維數(shù)組的指針其實是指向“指針變量地址”的指針變量。所以在聲明指向二維數(shù)組的指針時,用 int * array的形式。 有以下兩種方式來對二維數(shù)組分配內存:/ 方法一 #include <stdlib.h> / 必須包含該頭文件,里面定義了malloc的實現(xiàn) int * array = malloc( N * sizeof(int *) ); &
4、#160; for (int k=0;k<N;k+) arrayk = malloc( M * sizeof(int) ); / 方法二 #include <stdlib.h> int * array = malloc( N * sizeof(int *) ); array0 = malloc( M * sizeof(int) ); for (int k=1;k<N;k+)
5、arrayk = array0+M*k; 上述兩種方法的區(qū)別在于:前者在內存中分配的區(qū)域有可能是不連續(xù)的;而后者則在內存中的一片連續(xù)區(qū)域為該數(shù)組分配空間。 我們還可以通過一維數(shù)組模擬二維數(shù)組。在這中間要進行下標轉換。如對于模擬的NxM數(shù)組,訪問其第i行,第j列元素時,在一維數(shù)組中對應的位置是i*M+j。當然為了更簡捷,我們可以把這個數(shù)組下標轉換過程定義為一個宏,交由編譯系統(tǒng)來處理。 #define Arr2 ( array_name, row,col ) array_namerow*M+col
6、; 定義該宏后,訪問Arr2( array, i, j)等價于訪問 arrayi*M+j。今天寫程序的時候要用到二維數(shù)組作參數(shù)傳給一個函數(shù),我發(fā)現(xiàn)將二維數(shù)組作參數(shù)進行 傳遞還不是想象得那么簡單里,但是最后我也解決了遇到的問題,所以這篇文章主要介紹 如何處理二維數(shù)組當作參數(shù)傳遞的情況,希望大家不至于再在這上面浪費時間。 正文: 首先,
7、我引用了譚浩強先生編著的C程序設計上面的一節(jié)原文,它簡要介紹了如何 將二維數(shù)組作為參數(shù)傳遞,原文如下(略有改變,請原諒): 原文開始 可以用二維數(shù)組名作為實參或者形參,在被調用函數(shù)中對形參數(shù)組定義時可以可以指 定所有維數(shù)的大小,也可以省略第一維的大小說明,如: &
8、#160; void Func(int array310); void Func(int array10); 二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是 不合法的:
9、; void Func(int array); 因為從實參傳遞來的是數(shù)組的起始地址,在內存中按數(shù)組排列規(guī)則存放(按行存放), 而并不區(qū)分行和列,如果在形參中不說明列數(shù),則系統(tǒng)無法決定應為多少行多少列,不能 只指定一維而不指定第二維,下面寫法是錯誤的: void Func(int
10、 array3);實參數(shù)組維數(shù)可以大于形參數(shù)組,例如實參數(shù)組定義為 : void Func(int array310); 而形參數(shù)組定義為: int array510;
11、; 這時形參數(shù)組只取實參數(shù)組的一部分,其余部分不起作用。 原文結束 大家可以看到,將二維數(shù)組當作參數(shù)的時候,必須指明所有維數(shù)大小或者省略第一維的 ,但是不能省略第二維或者更高維的大小,這是由編譯器原理限制的。大家在學編譯原理 這么課程的時候知道編譯器是這樣處理數(shù)組的:
12、0; 對于數(shù)組 int pmn; 如果要取pij的值(i>=0 && i<m && 0<=j && j < n),編譯器是這樣尋址的,它的 地址為: p +
13、60; i*n + j; 從以上可以看出,如果我們省略了第二維或者更高維的大小,編譯器將不知道如何正確 的尋址。但是我們在編寫程序的時候卻需要用到各個維數(shù)都不固定的二維數(shù)組作為參數(shù), 這就難辦了,編譯器不能識別阿,怎么辦呢?不要著急,編譯器雖然不能識別,但是我們 完全可以不把它當作一個二維數(shù)組,而是把它當作一個普通的指
14、針,再另外加上兩個參數(shù) 指明各個維數(shù),然后我們?yōu)槎S數(shù)組手工尋址,這樣就達到了將二維數(shù)組作為函數(shù)的參數(shù) 傳遞的目的,根據這個思想,我們可以把維數(shù)固定的參數(shù)變?yōu)榫S數(shù)隨即的參數(shù),例如: void Func(int array310); void
15、0; Func(int array10); 變?yōu)椋? void Func(int *array, int m, int n); 在轉變后的函數(shù)中,arrayij這樣的式子是不對的(不信,大家可以試一下),因為 編譯器不能正確
16、的為它尋址,所以我們需要模仿編譯器的行為把arrayij這樣的式子 手工轉變?yōu)? *(int*)array + n*i + j); 在調用這樣的函數(shù)的時候,需要注意一下,如下面的例子:
17、; int a33 = 1, 1, 1, 2, 2, 2, 3, 3, 3 ;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版法院批準離婚合同標準模板一
- 2024年貨車租車合同模板
- 2024年簡易離婚合同填寫指南一
- 2024年福建高速加油站經營許可協(xié)議
- 2024新能源電動汽車充電設施安裝協(xié)議
- 2024植筋施工建筑裝飾項目分包合同
- 2025房屋租賃與智能家居系統(tǒng)安裝合同3篇
- 快遞服務員的工作崗位介紹
- 《電子工程師項目教學與訓練》課件第7章
- 2024施工保險購買合同范本
- 2025年安徽交控集團招聘筆試參考題庫含答案解析
- 促進臨床合理用藥持續(xù)改進措施
- MOOC 數(shù)字電路分析與設計-浙江大學 中國大學慕課答案
- 食堂日??己嗽u分表(后勤)
- 高頻淬火設備安全操作規(guī)程
- 閘閥的操作力矩參考表
- 浙江省市政工程安全臺賬完整
- 環(huán)氧樹脂參考配方大全
- 花木綠化養(yǎng)護考核評分表
- #2鍋爐爐膛內腳手架搭設及拆除施工方案
- 110KV變電站工程創(chuàng)優(yōu)監(jiān)理實施細則
評論
0/150
提交評論