在學(xué)習(xí)C語(yǔ)言的過(guò)程中遇到數(shù)組作為參數(shù)傳遞的問(wèn)題 一維數(shù)組:
這樣我們可以很順利的在test去遍歷這個(gè)數(shù)組a,當(dāng)然我們還可能傳遞指針:
一般來(lái)數(shù)參數(shù)的傳遞是值傳遞,也就是說(shuō)實(shí)參傳給形參,形參發(fā)生改變時(shí)實(shí)參并不會(huì)改變,(單向)但是數(shù)組在傳遞的時(shí)候是地址傳遞,只要形參發(fā)生了變化,實(shí)參也會(huì)發(fā)生變化(雙向)。 這樣傳遞數(shù)組就會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,我沒(méi)有辦法獲取到數(shù)組的長(zhǎng)度。獲取數(shù)組的長(zhǎng)度我們一般用:
我們會(huì)發(fā)現(xiàn)n的值一直是2!為什么會(huì)這樣呢???因?yàn)?,a是函數(shù)參數(shù),到了本函數(shù)中,a只是一個(gè)指針(地址,系統(tǒng)在本函數(shù)運(yùn)行時(shí),是不知道a所表示的地址有多大的數(shù)據(jù)存儲(chǔ)空間,這里只是告訴函數(shù):一個(gè)數(shù)據(jù)空間首地址),所以,sizoef(a)的結(jié)果是指針變量a占內(nèi)存的大小,一般在64位機(jī)上是8個(gè)字節(jié)。int類(lèi)型是4個(gè)字節(jié),所以,結(jié)果永遠(yuǎn)是2,因此,我們要向獲取數(shù)組長(zhǎng)度要怎么辦呢? 我可以在初始化數(shù)組的地方獲取到數(shù)組的長(zhǎng)度,作為參數(shù)傳遞過(guò)來(lái):
這樣做我們可以獲取到數(shù)組的長(zhǎng)度。 二維數(shù)組: 二維數(shù)組作為參數(shù)傳遞是后我們不可以像以為數(shù)組那樣直接,如:
會(huì)發(fā)現(xiàn)編譯都編譯不通過(guò),報(bào)“[Error] declaration of 'a' as multidimensional array must have bounds for all dimensions except the first”這個(gè)錯(cuò),意思是多維數(shù)組的定義必須有一個(gè)除第一個(gè)之外的所有維度的邊界,比如:
這樣就OK了,但是我們是動(dòng)態(tài)分配的數(shù)組不知道這個(gè)維度是多少的時(shí)候怎么辦?這時(shí)候我們可以用指針當(dāng)做一維數(shù)組來(lái)操作:
這樣我們發(fā)現(xiàn)不能更靈活的去定位到某一行某一列,這樣我們需要手工改變尋址方式:
|
|