一維數(shù)組的元素作為函數(shù)實(shí)參,與同類型的簡單變量作為實(shí)參一樣,是單向的值傳遞,即數(shù)組元素的值傳給形參,從而形參是改變不影響實(shí)參
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的新巴爾虎左網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
數(shù)組名代表著整個(gè)數(shù)組的地址,如果一維數(shù)組的名字作為函數(shù)實(shí)參,傳遞的是整個(gè)數(shù)組,即形參數(shù)組和實(shí)參數(shù)組完全相同,是存放在同一存儲(chǔ)空間的同一個(gè)數(shù)組。這樣形參數(shù)組
修改時(shí),實(shí)參數(shù)組也同時(shí)被修改了。形參數(shù)組的元素個(gè)數(shù)可以省略。
#includestdio.h
//數(shù)組作為函數(shù)參數(shù),可以省略元素個(gè)數(shù)
//數(shù)組作為函數(shù)參數(shù),傳遞是整個(gè)數(shù)組的地址,修改了函數(shù)形參數(shù)組元素的值,會(huì)影響到外面的實(shí)參數(shù)組
void change(int array[])
{
printf("array ==%p\n",array);
array[0] = 100;
}
int main()
{
int ages[6] = {10,11,13,15,11,18};
printf("array ==%p\n",ages);
change(ages);
printf("%d\n",ages[0]);
return 0;
}
輸出結(jié)果為: array ==0x7fff5be26c00
array ==0x7fff5be26c00
100
在學(xué)習(xí)C語言的過程中遇到數(shù)組作為參數(shù)傳遞的問題
一維數(shù)組:
這樣我們可以很順利的在test去遍歷這個(gè)數(shù)組a,當(dāng)然我們還可能傳遞指針:
一般來數(shù)參數(shù)的傳遞是值傳遞,也就是說實(shí)參傳給形參,形參發(fā)生改變時(shí)實(shí)參并不會(huì)改變,(單向)但是數(shù)組在傳遞的時(shí)候是地址傳遞,只要形參發(fā)生了變化,實(shí)參也會(huì)發(fā)生變化(雙向)。
這樣傳遞數(shù)組就會(huì)發(fā)現(xiàn)一個(gè)問題,我沒有辦法獲取到數(shù)組的長度。獲取數(shù)組的長度我們一般用:
我們會(huì)發(fā)現(xiàn)n的值一直是2!為什么會(huì)這樣呢?。?/p>
因?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類型是4個(gè)字節(jié),所以,結(jié)果永遠(yuǎn)是2,因此,我們要向獲取數(shù)組長度要怎么辦呢?
我可以在初始化數(shù)組的地方獲取到數(shù)組的長度,作為參數(shù)傳遞過來:
這樣做我們可以獲取到數(shù)組的長度。
二維數(shù)組:
二維數(shù)組作為參數(shù)傳遞是后我們不可以像以為數(shù)組那樣直接,如:
會(huì)發(fā)現(xiàn)編譯都編譯不通過,報(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ù)組來操作:
這樣我們發(fā)現(xiàn)不能更靈活的去定位到某一行某一列,這樣我們需要手工改變尋址方式:
傳數(shù)組給一個(gè)函數(shù),數(shù)組類型自動(dòng)轉(zhuǎn)換為指針類型,因而傳的實(shí)際是地址。
void func(int array[10])
void func(int array[])
void func(int *array)
所以以上三種函數(shù)聲明完全等同。
實(shí)際情況是,數(shù)組做參數(shù),完全無法按值傳遞。這是由C/C++函數(shù)的實(shí)現(xiàn)機(jī)制決定的。
下一個(gè)問題是:為什么偏要按值傳遞呢?當(dāng)要在一個(gè)函數(shù)內(nèi)使用一個(gè)數(shù)組時(shí),傳一個(gè)指針進(jìn)去不就行了?只要能訪問到我們所要的數(shù)據(jù)并對其進(jìn)行操作,何苦鉆牛角尖。