剛學c++,對這方面也瞭解的不深刻,寫的可能有些不對,但願指點!
關於這個問題,能夠說一直糾結了我許久,每次我想用數組做爲形參傳給函數時,發現老是出錯,今天又遇到這個問題了,我就來分享下個人思路。
我是想寫一個函數用於數組排序用的;傳入的數組大小不肯定,因而我想用sizeof(a)/sizeof(a[0])
方法測出數組的長度,後來測試,在函數裏面測出實參的長度行不通。通過百度查詢,終於弄清楚了。
緣由:有兩種傳遞方法,一種是function(int a[]); 另外一種是function(int *a,int m(數組的大小))c++
這兩種兩種方法在函數中對數組參數的修改都會影響到實參自己的值!數組
對於第一種,根據以前所學,形參是實參的一份拷貝,是局部變量。可是數組是個例外,由於數組的數據太多了,將其一一賦值既麻煩又浪費空間,因此數組做爲參數傳遞給函數的只是數組首元素的地址,數據仍是在內存裏的,函數在須要用到後面元素時再按照這個地址和數組下標去內存查找。也就是說後面的元素根本沒到函數裏來。因此,這裏也不能在函數內部用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看成一個指針使用。code
void paixu(int a[]) { for(int i=0;i<10;i++) { cout<<*a<<endl; a++; } }
不過這種方法很雞肋,必需要提早知道數組有多長。排序