數組如何作為形參傳給函數?
剛學c++,對這方面也了解的不深入,寫的可能有些不對,希望指點!
關於這個問題,可以說一直糾結了我許久,每次我想用數組作為形參傳給函數時,發現總是出錯,今天又遇到這個問題了,我就來分享下我的思路。
我是想寫一個函數用於數組排序用的;傳入的數組大小不確定,於是我想用sizeof(a)/sizeof(a[0])
方法測出數組的長度,后來測試,在函數里面測出實參的長度行不通。經過百度查詢,終於弄清楚了。
原因:有兩種傳遞方法,一種是function(int a[]); 另一種是function(int *a,int m(數組的大小))
這兩種兩種方法在函數中對數組參數的修改都會影響到實參本身的值!
對於第一種,根據之前所學,形參是實參的一份拷貝,是局部變量。但是數組是個例外,因為數組的數據太多了,將其一一賦值既麻煩又浪費空間,所以數組作為參數傳遞給函數的只是數組首元素的地址,數據還是在內存里的,函數在需要用到后面元素時再按照這個地址和數組下標去內存查找。也就是說后面的元素根本沒到函數里來。所以,這里也不能在函數內部用sizeof求數組的大小,必須在外面算好了再傳進來。為了方便,下面分析方法二。
實例:
void pai(int a[],int m)
{
int tem;
for (int i=0;i<m;i++)
{
int mix=i;
for(int j=i+1;j<m;j++)
{
if(a[mix]>a[j])
mix=j;//找出最小的數字的位置,注意此處是循環了m-i+1次后在執行下面的交換代碼。
tem=a[i];//下面才開始換最小的數
a[i]=a[mix];
a[mix]=tem;
}
}
}
這只是一個函數,在main函數中采用sizeof(a)/sizeof(a[0]
求解所傳入的數組的長度,用形參傳入函數。
int ss[]={111,2,34,4,53,65,34,22,43,45};
int m=sizeof(ss)/sizeof(ss[0]);
//cout<<m<<endl;
pai(ss,m);
這樣便把數組中的排序問題解決了,不過始終感覺不方便,不能之接傳輸數組。第一種方法也可以用:直接把實參a當作一個指針使用。
void paixu(int a[])
{
for(int i=0;i<10;i++)
{
cout<<*a<<endl;
a++;
}
}
不過這種方法很雞肋,必須要提前知道數組有多長。