結論:陣列做函式引數時退化為乙個指標變數,當我們需要傳陣列的時候,正確的做法是把陣列和陣列的有效長度傳給函式。
陣列做函式引數的幾種形式:
一: void printarray( int arr ) {}
二: void printarray( int arr[10] ) {}
三: void printarray( int *arr ) {}
為什麼說陣列做函式引數會退化成乙個指標變數?有什麼依據?
我們先宣告乙個陣列 :
int arr = ;
然後對陣列求大小 :
sizeof(arr) : 40;
這個結果是顯而易見的,大小是40位元組,10個整型資料型別的大小。
但是,我們把實參arr傳遞給printarray函式的形參arr以後,再在printarray函式裡面對形參arr求大小,包括以上三種函式宣告形式:
sizeof(arr) : 4;
sizeof(arr[10]) : 4;
sizeof(*arr) : 4;
它們的大小都是4個位元組,指標在32位機下也是四個位元組。由此可見,陣列做函式引數實際上就是把陣列的記憶體的首位址傳遞給形參,形參是乙個指向陣列首位址的指標。
所以,初學者喜歡犯的錯誤就是把陣列傳遞給形參以後,在函式內用sizeof()的方法去求陣列的實際大小,這麼做求得的大小永遠是乙個整型資料的大小,所以是錯誤的。
錯誤示例:
void fun(int arr / arr / / arr[10]*/ )
}正確示例:
void fun(int arr / arr / / arr[10]*/ , int size )
}
C 引數傳遞時到底發生了什麼
1 引用型別的變數只包含物件所在的記憶體位址,將要複製的是記憶體位址而不是物件本身,所以對底層物件的修改會保留。unsafeclassprogram fixed int pid mye.id 值為 uint pid uint pid testmethod mye fixed int pid mye....
函式呼叫時發生了什麼
我們下面就來 一下高階語言中函式的呼叫和遞迴等性質是怎樣通過系統棧巧妙實現的。請看如下 int func b int arg b1,int arg b2 int func a int arg a1,int arg a2 int main int argc,char argv,char envp 這段...
函式呼叫時發生了什麼
第一步 函式呼叫 1 對實參表從右向左,一次計算出實參的值,並且將值壓棧。2 將函式呼叫語句 儲存到在棧中,以便函式呼叫完成後返回。壓棧 3 跳轉到函式體處。第二步 函式體執行 4 如果函式體中定義了變數,將變數壓棧 5 將每乙個形參以棧中對應的 實參值取代,執行函式體的功能體。6 將函式體中的變數...