二維數(shù)組作為函數(shù)參數(shù),實參可以直接使用二維數(shù)組名,在被調(diào)用函數(shù)中對形參數(shù)組定義可以指定所有維數(shù)的大小,也可以省略第一維的大小說明,如:

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比三穗網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式三穗網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋三穗地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
它們是合法且等價,也可以使用如下形式:
但不能省略第二維的大小,如下面的定義是不合法的,編譯時會出錯:
因為從實參傳遞來的是數(shù)組的起始地址,如果在形參中不說明列數(shù),編譯器將無法定位元素的的位置。
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ù)定義:
編譯運(yùn)行:
這下就正常了。
參數(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(bǔ)的值賦給p,再傳遞給foo函數(shù)。
下面例子,作為 指針傳遞 和 行指針傳遞。
#include stdio.h
void fun(int *p1,int (*p2)[3], int row, int col){
int i,j;
for (i=0;i3;i++){
for (j=0;j4;j++) {
printf("%d ",p1[i*col+j]);
p2[j][i]=p1[i*col+j];
};
printf("\n");
};
}
int main(){
int a[3][4],b[4][3];
int i,j;
for (i=0;i3;i++)for (j=0;j4;j++) a[i][j]=(i+1)*10+j;
fun(a[0][0],b[0], 3,4);
printf("\n");
for (i=0;i4;i++){
for (j=0;j3;j++) printf("%d ",b[i][j]);
printf("\n");}
return 0;
}
或這樣:
void fun(int p1[3][4],int p2[4][3]){
int i,j;
for (i=0;i3;i++){
for (j=0;j4;j++) {
printf("%d ",p1[i][j]);
p2[j][i]=p1[i][j];
};
printf("\n");
};
}
調(diào)用: fun(a,b); 即可。
對的,是我的第二種方法。
1.可以用指針。
void
Func(int
**array,
int
m,
int
n);
在轉(zhuǎn)變后的函數(shù)中,array[i][j]這樣的式子是不對的(不信,大家可以試一下),因為編譯器不能正確的為它尋址,所以我們需要模仿編譯器的行為把a(bǔ)rray[i][j]這樣的式子手工轉(zhuǎn)變?yōu)椋?/p>
*((int*)array
+
n*i
+
j);
2.可以用二維數(shù)組名作為實參或者形參,在被調(diào)用函數(shù)中對形參數(shù)組定義時可以指定所有維數(shù)的大小,也可以省略第一維的大小說明,如:
void
Func(int
array[3][10]);
void
Func(int
array[][10]);
二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:
void
Func(int
array[][]);
因為從實參傳遞來的是數(shù)組的起始地址,在內(nèi)存中按數(shù)組排列規(guī)則存放(按行存放),而并不區(qū)分行和列,如果在形參中不說明列數(shù),則系統(tǒng)無法決定應(yīng)為多少行多
少列,不能只指定一維而不指定第二維,下面寫法是錯誤的:
void
Func(int
array[3][]);
實參數(shù)組維數(shù)可以大于形參數(shù)組,例如實參數(shù)組定義為:
void
Func(int
array[3][10]);
而形參數(shù)組定義為:
int
array[5][10];
這時形參數(shù)組只取實參數(shù)組的一部分,其余部分不起作用。
文章名稱:c語言二維數(shù)組與函數(shù),c語言二維數(shù)組函數(shù)的使用方法
分享鏈接:http://chinadenli.net/article23/dsshscs.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、ChatGPT、服務(wù)器托管、外貿(mào)建站、云服務(wù)器、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)