c語言調(diào)用二維數(shù)組的函數(shù) c語言二維數(shù)組函數(shù)的使用方法

如何通過函數(shù)調(diào)用二維數(shù)組

C語言編程的過程中,不可避免的會(huì)碰到二維或二維以上的數(shù)組作為函數(shù)的形參的情況,在以前的編程過程中,習(xí)慣了動(dòng)態(tài)數(shù)組的應(yīng)用,很是使用直接定義高維數(shù)組。最近在編程的過程中就碰到了這個(gè)問題:有如下的測(cè)試程序:

成都創(chuàng)新互聯(lián)技術(shù)團(tuán)隊(duì)10多年來致力于為客戶提供網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、成都品牌網(wǎng)站建設(shè)、成都全網(wǎng)營(yíng)銷推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了千余家網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。

voidtest(double??**x,int?Row,int?Col);

voidtest(double??**x)

{

for(int?i=0;iRow;i++)

for(int?k=0;kCol;k++)

x[i][k]?+=?100.0;

}

intmain(int?argc,?char?*argv[])

{

/*

double?**x;

x?=?new?double?*[3];

for(int?i=0;i3;i++)

x[i]?=?new?double[3];

*/

double?x[3][3];

for(int?i=0;i3;i++)

for(int?k=0;k3;k++)

x[i][k]?=?i*k;

test(x,3,3);

for(int?i=0;i3;i++)

for(int?k=0;k3;k++)

printf("x[%d][%d]=?%e\n",i,k,x[i][k]);

getch();

return?0;

}

編譯時(shí)提示Cannot?convert?'double?[*][3]'?to?double?**'。

將調(diào)用方式強(qiáng)制進(jìn)行類型轉(zhuǎn)換:test((double?**)x),編譯通過,運(yùn)行出錯(cuò),提示非法越界。

據(jù)傳:因?yàn)闂I戏峙涞臄?shù)組和堆上分配的數(shù)組在內(nèi)存排列上可能不相同,直接定義的數(shù)組是存儲(chǔ)在程序的堆棧區(qū),數(shù)據(jù)占用連續(xù)的區(qū)間;而動(dòng)態(tài)申請(qǐng)的數(shù)組是在系統(tǒng)的遠(yuǎn)堆上(far?heap),除最后一維的元素是連續(xù)存放的外,其他維上的元素有可能不是在一塊連續(xù)的內(nèi)存區(qū)域里。

//棧上:?

int???ia[2][2]???=?{2,3,4,5};????//4個(gè)元素是連續(xù)排列的內(nèi)存段?

//堆上:?

int???**p??=??new??int*[2];???//只有每行內(nèi)是連續(xù)排列,各行并不一定連續(xù)排列?

for?(?int??i??=?0;??i???2;?i++?)?

{?

p[i]???=??new??int[2];?

}?

for?(?int??i??=??0;??i????2;??i++?)?

{?

for?(?int??j??=??0;??j????2;??j++?)?

{?

p[i][j]???=???ia[i][j];?

}?

}?

所以對(duì)棧上的數(shù)組用int??**p指向首地址,因?yàn)閕nt??**p一次解引用為地址指針,而非堆上的指向數(shù)組的指針,所以二次解引用會(huì)出錯(cuò)。?

如果找一個(gè)通用方程只能用:?

void???f(?int??*p,?int??row,??int??col?)?????//給出數(shù)組的行和列,對(duì)堆上的數(shù)組不合適???

{?

for?(?int??i?=??0;??i????row;??i++)?

{?

for?(?int??j??=??0;??j???col;??j++?)?

{?

cout???p[i?*?row?+?j]???"???";????????????????????????

}?

cout???endl;?

}?

}?

int???main(){?

//.........?

int???ia[2][2]???=??{2,3,4,5};?

f(?(int*)ia,?2,?2?);?

}

采用上面的通用辦法還是比較麻煩,這無形中對(duì)編程增加了難度,為了避免這個(gè)麻煩可以采用動(dòng)態(tài)數(shù)組的形式,將原來采用直接定義的數(shù)組全部換成動(dòng)態(tài)數(shù)組,類似開頭例子中被注釋掉的那部分代碼,當(dāng)然這樣也有后續(xù)的麻煩,動(dòng)態(tài)數(shù)組的生命周期完成后必須釋放內(nèi)存空間,這也有點(diǎn)羅嗦,但是畢竟可以直接使用數(shù)組的形式,比上面的通用方式還是要簡(jiǎn)單一點(diǎn)。

如果執(zhí)意要使用直接定義的數(shù)組該怎么辦呢?有如下幾種方法:

方法一:

voidtest(double??(*x)[3],?int?Row,?int?Col);

調(diào)用方式:test(x,Row,Col);

調(diào)用用方式?test(x,Row,Col);

方法二:

voidtest(double??x[][3],?int?Row,int?Col);

調(diào)用方式?test(x,Row,Col);

對(duì)于多維數(shù)組作為參數(shù),除第一維之外的其它維必須指定維數(shù),否則是肯定編譯不過去的。

從上面的對(duì)直接定義的數(shù)組的引用情況看,直接定義的數(shù)組的使用比較麻煩,一旦直接定義數(shù)組的維數(shù)發(fā)生變換,函數(shù)的定義必須相應(yīng)的修改,否則程序就會(huì)出錯(cuò),這也增加了程序進(jìn)一步開發(fā)的麻煩,為了一勞永逸的解決這個(gè)問題,建議還是使用動(dòng)態(tài)數(shù)組的方法,雖然需要手工釋放內(nèi)存,但是除卻了后續(xù)的麻煩。

C++函數(shù)調(diào)用二維數(shù)組

n如果是變量的話,數(shù)組編譯時(shí)都通不過吧。數(shù)組分配時(shí)必須知道大小。

函數(shù)應(yīng)該這樣聲明function(char array[10][10])或省略第一維的大小function(char array[][10])

function(char array[n][n])這樣是錯(cuò)誤的,數(shù)組的索引必須是個(gè)常量表達(dá)式

如果需要必須有cin決定大小,那就應(yīng)該是動(dòng)態(tài)分配的二位數(shù)組

char ** aa;

int n;

cinn;

aa = new char *[n];

for ( int i=0;i n;i++ )

aa[i] = new char [n];

這樣給函數(shù)傳遞參數(shù)function((char**)array),但這樣在實(shí)際的函數(shù)調(diào)用是,我們就要進(jìn)行強(qiáng)制轉(zhuǎn)換才可以用;在函數(shù)調(diào)用時(shí),要把數(shù)組形式寫成指針形式如*((int*)array + n*i + j);直接寫char array[i][j]會(huì)導(dǎo)致錯(cuò)誤,編譯可以通過,在VC編譯器中執(zhí)行會(huì)出現(xiàn)異常

建議樓主直接用vector容器,vectorvectorchar 或vectorstring

C語言二維數(shù)組的函數(shù)調(diào)用

函數(shù)調(diào)用不能這么用,第36行。C標(biāo)準(zhǔn)里面返回值是不能直接返回一個(gè)數(shù)組的,只能返回?cái)?shù)組的首地址。輸出學(xué)生成績(jī)和每科成績(jī)那個(gè)函數(shù),你可以定義一個(gè)全局變量數(shù)組,還有求平均值最好用float 或者double,用int會(huì)造成精度流失。幫你調(diào)試了一下,大概就這樣吧

新聞名稱:c語言調(diào)用二維數(shù)組的函數(shù) c語言二維數(shù)組函數(shù)的使用方法
URL標(biāo)題:http://muchs.cn/article26/ddiisjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、營(yíng)銷型網(wǎng)站建設(shè)微信小程序、全網(wǎng)營(yíng)銷推廣面包屑導(dǎo)航、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)