這樣傳:
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、潁州網(wǎng)絡(luò)推廣、小程序制作、潁州網(wǎng)絡(luò)營銷、潁州企業(yè)策劃、潁州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供潁州建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
函數(shù)聲明:Func(變量類型 *[二維數(shù)組的列長] arry);
char arry[][4] ;
Func(arry);
在C語言中可以用二維數(shù)組作為實參或者形參。
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)無法決定應(yī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ù)組的組織形式。只有有了列長度,通過下標(biāo)a[i][j]時才能得到正確的下標(biāo)地址,即:
我們改一下上面的額foo函數(shù)定義:
編譯運行:
這下就正常了。
參數(shù)如上所列。
我們看到,函數(shù)的參數(shù)聲明改成了:
這個聲明的含義是:
不過此時還是需要指定二維數(shù)組的列長度,不然函數(shù)內(nèi)部還是無法使用二維下標(biāo)去訪問數(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ù)原型 type fun (type (name*)[size])
type是你要定義的類型,fun是函數(shù)名,name是在函數(shù)中二維數(shù)組的名字,
size是二維數(shù)組第2維的長度。
這樣調(diào)用這個函數(shù)只需要把二維數(shù)組函數(shù)名傳遞就可以了。