日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

能否向函数传递一个数组?

發(fā)布時間:2025/6/15 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 能否向函数传递一个数组? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
能否向函數(shù)傳遞一個數(shù)組?
例:
void fun(char a[10])?
{?
? ?char c = a[3];?
}?


int main()
{?
? ?char b[10] = “abcdefg”;
? ?fun(b[10]); return 0;
?}


答案:
(1)先看上面的調(diào)用,fun(b[10]);將b[10]這個數(shù)組傳遞到fun 函數(shù)。但這樣正確嗎?b[10]是代表一個數(shù)組嗎? 顯然不是,我們知道b[0]代表是數(shù)組的一個元素,那b[10]又何嘗不是呢?只不過這里數(shù)組越界了,這個b[10]并不存在。但在編譯階段,編譯器并不會真正計算b[10]的地址并取值,所以在編譯的時候編譯器并不認(rèn)為這樣有錯誤。雖然沒有錯誤,但是編譯器仍然給出了兩個警告:?
warning C4047: 'function' : 'char *' differs in levels of indirection from 'char '?
warning C4024: 'fun' : different types for formal and actual parameter 1?
這兩個警告告訴我們,函數(shù)參數(shù)需要的是一個char*類型的參數(shù),而實際參數(shù)為char 類型,不匹配。雖然編譯器沒有給出錯誤,但是這樣運行肯定會有問題。


(2)b[10]并不存在,在編譯的時候由于沒有去實際地址取值,所以沒有出錯,但是在運行時,將計算b[10]的實際地址,并且取值。這時候發(fā)生越界錯誤。


(3)編譯器的警告已經(jīng)告訴我們編譯器需要的是一個char*類型的參數(shù),而傳遞過去的是一個char 類型的參數(shù),這時候fun 函數(shù)會將傳入的char 類型的數(shù)據(jù)當(dāng)?shù)刂诽幚?#xff0c;同樣會發(fā)生錯誤。


(4)為什么編譯器告訴我們它需要的是一個char*類型的參數(shù)?C 語言中,當(dāng)一維數(shù)組作為函數(shù)參數(shù)的時候,編譯器總是把它解析成一個指向其首元素首地址的指針。這么做是有原因的。在C 語言中,所有非數(shù)組形式的數(shù)據(jù)實參均以傳值形式調(diào)用,然而,如果要拷貝整個數(shù)組,無論在空間上還是在時間上,其開銷都是非常大的。更重要的是,在絕大部分情況下,你其實并不需要整個數(shù)組的拷貝,你只想告訴函數(shù)在那一刻對哪個特定的數(shù)組感興趣。這樣的話,為了節(jié)省時間和空間,提高程序運行的效率,于是就有了上述的規(guī)則。所以說:說函數(shù)的參數(shù)是一個char*類型的指針。


(5)同樣的,函數(shù)的返回值也不能是一個數(shù)組,而只能是指針。這里要明確的一個概念就是:函數(shù)本身是沒有類型的,只有函數(shù)的返回值才有類型。


我們完全可以把fun 函數(shù)改寫成下面3種形式:
形式一:
void fun(char *p)?
{?
char c = p[3]; //或者是char c = *(p+3);
}


形式二:
void fun(char a[10])?
{?
char c = a[3];?
}


?int main()?
{?
char b[100] = “abcdefg”;
fun(b);?
return 0;?
}


形式三:
void fun(char a[ ])?
{?
char c = a[3];?
}
改寫成這樣或許比較好,至少不會讓人誤會成只能傳遞一個10 個元素的數(shù)組。

總結(jié)

以上是生活随笔為你收集整理的能否向函数传递一个数组?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。