在C語言中可以用二維數(shù)組作為實參或者形參。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供陽原網(wǎng)站建設、陽原做網(wǎng)站、陽原網(wǎng)站設計、陽原網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、陽原企業(yè)網(wǎng)站模板建站服務,10多年陽原做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
1、函數(shù)中用二維數(shù)組作為形參,函數(shù)聲明中可以指定所有維數(shù)的大小,也可以省略第1維的維數(shù)如:
void?f(int?array[3][10]);?//正確
void?f(int?array[][10]);??//正確
上面的兩種二維數(shù)組形參表示都是正確的。
2、函數(shù)中用二維數(shù)組作為形參,不能把第2維或者更高維的大小省略,如下面的定義是不合法的:
void?f(int?array[][]);?//錯誤
因為從實參傳遞來的是數(shù)組的起始地址,在內(nèi)存中按數(shù)組排列規(guī)則存放(按行存放),而并不區(qū)分行和列,如果在形參中不說明列數(shù),則系統(tǒng)無法決定應為多少行多少列,不能只指定一維而不指定第二維,下面寫法是錯誤的:
void?f(int?array[3][]);??//錯誤
3、二維數(shù)組作為實參傳遞時,必須保證實參第2維的維數(shù)與形參第2維的維數(shù)相同,因為必須要保證形參和實參的數(shù)據(jù)類型一致。比如定義如下函數(shù):
void?f(int?array[][10]);
可以將如下數(shù)組傳遞給函數(shù)f。
int?a[2][10]?=?{1,2,3,4};?
int?b[4][10]?=?{1};
C語言如果給函數(shù)傳遞二維數(shù)組作為參數(shù)
先看一個傳遞二維數(shù)組的例子:
編譯:
程序看著沒有任何問題,但是編譯器通不過,報錯在處理二維數(shù)組參數(shù)a的時候,類型不兼容。
C語言里面對二維數(shù)組的存儲是按照一維數(shù)組來處理的,二維數(shù)組按照行展開的方式按順序存儲,例如在上面的例子中:
二維數(shù)組a的定義:
它等同于一維數(shù)值的定義:
因為他們的空間存儲分配一樣的。
所以在利用二維數(shù)組作為參數(shù)傳遞時,必須指定二維數(shù)組的列數(shù),否則函數(shù)無法勾畫出二維數(shù)組的組織形式。只有有了列長度,通過下標a[i][j]時才能得到正確的下標地址,即:
我們改一下上面的額foo函數(shù)定義:
編譯運行:
這下就正常了。
參數(shù)如上所列。
我們看到,函數(shù)的參數(shù)聲明改成了:
這個聲明的含義是:
不過此時還是需要指定二維數(shù)組的列長度,不然函數(shù)內(nèi)部還是無法使用二維下標去訪問數(shù)組:
編譯:
原因同前面方法1一致,如果要訪問二維數(shù)組,必須指定列的長度,否則無法計算出該元素的地址,a[i][j]=a [ (i-1)*COLNUM + j ],如果沒有COLNUM,那么這個地址無法計算出來。從形參的聲明來說,a就是一個指針,指向一維數(shù)組的指針,而不是一個二維數(shù)組。
這里要注意的是指針的指針,和二維數(shù)組的差異;二維數(shù)組的地址是連續(xù)的,所有成員按順序排序;而指針的指針只要求指針地址連續(xù),而不要求指針的指針地址連續(xù)。
然后作為實參傳遞時,也不能直接使用a傳遞,因為類型不匹配,必須定義新的變量p,然后把a的值賦給p,再傳遞給foo函數(shù)。
這樣傳:
函數(shù)聲明:Func(變量類型 *[二維數(shù)組的列長] arry);
char arry[][4] ;
Func(arry);