C中數(shù)組名代表該數(shù)組的首地址,
成都創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、武岡網(wǎng)站定制設(shè)計、自適應品牌網(wǎng)站建設(shè)、H5技術(shù)、商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為武岡等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
char
s[]="abc";
s代表的就是‘a(chǎn)’在內(nèi)存中的地址
以地址作參數(shù)
,實參和形參同時改變
在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)無法決定應為多少行多少列,不能只指定一維而不指定第二維,下面寫法是錯誤的:
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ù)組:
這樣我們可以很順利的在test去遍歷這個數(shù)組a,當然我們還可能傳遞指針:
一般來數(shù)參數(shù)的傳遞是值傳遞,也就是說實參傳給形參,形參發(fā)生改變時實參并不會改變,(單向)但是數(shù)組在傳遞的時候是地址傳遞,只要形參發(fā)生了變化,實參也會發(fā)生變化(雙向)。
這樣傳遞數(shù)組就會發(fā)現(xiàn)一個問題,我沒有辦法獲取到數(shù)組的長度。獲取數(shù)組的長度我們一般用:
我們會發(fā)現(xiàn)n的值一直是2!為什么會這樣呢!?
因為,a是函數(shù)參數(shù),到了本函數(shù)中,a只是一個指針(地址,系統(tǒng)在本函數(shù)運行時,是不知道a所表示的地址有多大的數(shù)據(jù)存儲空間,這里只是告訴函數(shù):一個數(shù)據(jù)空間首地址),所以,sizoef(a)的結(jié)果是指針變量a占內(nèi)存的大小,一般在64位機上是8個字節(jié)。int類型是4個字節(jié),所以,結(jié)果永遠是2,因此,我們要向獲取數(shù)組長度要怎么辦呢?
我可以在初始化數(shù)組的地方獲取到數(shù)組的長度,作為參數(shù)傳遞過來:
這樣做我們可以獲取到數(shù)組的長度。
二維數(shù)組:
二維數(shù)組作為參數(shù)傳遞是后我們不可以像以為數(shù)組那樣直接,如:
會發(fā)現(xiàn)編譯都編譯不通過,報“[Error] declaration of 'a' as multidimensional array must have bounds for all dimensions except the first”這個錯,意思是多維數(shù)組的定義必須有一個除第一個之外的所有維度的邊界,比如:
這樣就OK了,但是我們是動態(tài)分配的數(shù)組不知道這個維度是多少的時候怎么辦?這時候我們可以用指針當做一維數(shù)組來操作:
這樣我們發(fā)現(xiàn)不能更靈活的去定位到某一行某一列,這樣我們需要手工改變尋址方式: