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ù)的麻煩。
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
函數(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)