2014-01-14 89 views
0
//function prototype at the top 
void fillRandArray(int A[], int number, int maxNum); 

//function declaration 
void fillRandArray(int* A, int number, int maxNum) { 
    for(int i = 0; i < number; i++) { 
     A[i] = rand() % maxNum + 1; 
    } 
} 

int A[MAX_STUDENTS]; 

fillRandArray(A, number, 44); 

我不明白的代碼,所以原型設定int A[] 那麼宣言中int* A函數參數中的A和A []有什麼區別?

當我們通過參數,我們不應該通過這樣的...

fillRandArray(A[MAX_STUDENTS], number, 44); <---- ??? 
+0

這裏看看:http://stackoverflow.com/questions/1790704/difference-between-方括號和星號 – prajmus

回答

2

的下面的代碼傳遞一個數組的名字,這是一個地址。

void fillRandArray(int A[], int number, int maxNum); 

下面的代碼只傳遞一個地址的名稱,在這種情況下恰好是A的地址。他們基本上在做同樣的事情。

void fillRandArray(int* A, int number, int maxNum) 

你不會傳遞參數如下所示:

fillRandArray(A[MAX_STUDENTS],..., ...); 

因爲你告訴編譯器期待一個地址,而不是數組的元素。所以你只需將它傳遞給A(即數組的名稱,也是起始地址)。所以它看起來像這樣:

fillRandArray(A, number, 44); 

如果我沒有解釋得不夠好的話,可以問更多的問題。

+0

謝謝,所以數組通過引用傳遞?因爲它不需要* – Joshua

+0

是的,我相信數組在C++中通過引用傳遞。引用表示對實際數組的引用(即井地址)傳遞給函數,而不是通過值傳遞,這只是一個副本。如果你不想在你的函數中改變數組,你可以將const放在數組的前面。 – MrPickle5

+1

數組的名稱是__not__地址。 –

1

問題是C風格的數組不能作爲參數 傳遞給函數。當您將int a[]作爲參數寫入 函數時,編譯器會將其轉換爲int* a。在 另外,如果您提供維度(例如int a[10]),則簡單地忽略它 。

此外,一個數組可以轉換爲指針,並將在上下文的很多 中這樣做。這發生在fillRandArray(A, number, 44);數組A隱式轉換爲指針。

至於fillRandArray(a[MAX_STUDENTS], number, 44),這個 索引到第一個元素的數組;與您的 聲明,它通過一個int(不是一個數組或指針), ,除了它訪問數組的末尾之外,因此它是 未定義的行爲。

一般情況下,要避免這種情況(雖然main,你 不能):該功能應該可以接受一個std::vector<int>& a,或者在一些特殊情況下,int (&a)[N](在這種情況下, 功能應是模板,並且N是模板 參數)。所以,你可能會這樣寫:

template <size_t N> 
void fillRandArray(int (&a)[N], int maxNumber) 
{ 
    for (int i = 0; i != N; ++ i) { 
     a[i] = rand() % maxNum + 1; 
    } 
} 

(但對於這樣的事情,std::vector遠preferrable。)

相關問題