2012-04-29 71 views
10

這感覺就像一個真正愚蠢的事情要問,但我已經有人採取了編程課問我對工作分配一些幫助,我看到這個在他們的代碼(在匈牙利命名法請無評論):函數聲明中,傳遞固定大小的數組意味着什麼?

void read_dictionary(string ar_dictionary[25], int & dictionary_size) {... 

其中,主要是C#程序員(我在大學裏學過C和C++),我甚至都不知道你能做到。我總是告訴,並已閱讀,因爲,你應該有

void read_dictionary(string ar_dictionary[], int ar_dictionary_size, int & dictionary_size) {... 

我聽說這位教授給了他們這一點,它的工作原理,所以什麼聲明一個固定大小的數組一樣,甚至意味着? C++沒有原始的方式知道傳遞給它的數組的大小(即使我認爲可能已經在最新的規範中被改變)

+0

它必須知道數組的大小原生方式:這種方法。如果你告訴它陣列有多棒,它會相信它。 – 2012-04-29 04:58:10

+1

參數聲明中的'25'被編譯器忽略。它與'string ar_dictionary []'相同。 – 2012-04-29 04:59:10

+0

@ H2CO3沒有什麼功能可以對這個數字做任何事情,也沒有任何方式讓編譯器檢查是否傳遞給它的尺寸...... – cost 2012-04-29 05:05:17

回答

10

在一維數組中它沒有意義並且被編譯器。在兩維或更多維數組中它可以是有用的,並且被函數用作確定矩陣(或多維數組)的行長度的方式。例如:

int 2dArr(int arr[][10]){ 
    return arr[1][2]; 
} 

這個函數將根據指定的長度知道的arr[1][2]的地址,並且還編譯器不應該接受陣列的不同尺寸用於該功能 -

int arr[30][30]; 
2dArr(arr); 

不允許和將是一個編譯器錯誤(克++):

error: cannot convert int (*)[30] to int (*)[10] 
+0

你是什麼意思函數會知道地址? – cost 2012-04-29 05:30:24

+1

在[x] [y]訪問數組意味着訪問y行和第x列的元素。爲此,您必須知道該行的長度。 'arr [1] [2]'與'arr [2 * 10 + 1]'相同。 – WeaselFox 2012-04-29 07:59:41

5

參數聲明的25由編譯器忽略。這和你寫下string ar_dictionary[]一樣。這是因爲數組類型的參數聲明被隱式地調整爲指向元素類型的指針。

所以以下三個函數聲明是等價的:

void read_dictionary(string ar_dictionary[25], int& dictionary_size) 
void read_dictionary(string ar_dictionary[], int& dictionary_size) 
void read_dictionary(string *ar_dictionary, int& dictionary_size) 

即使在第一功能的情況下,以明確聲明數組的大小,sizeof(ar_dictionary)將返回相同的值sizeof(void*)

參見this sample on Codepad

#include <string> 
#include <iostream> 

using namespace std; 

void read_dictionary(string ar_dictionary[25], int& dictionary_size) 
{ 
    cout << sizeof(ar_dictionary) << endl; 
    cout << sizeof(void*) << endl; 
} 

int main() 
{ 
    string test[25]; 
    int dictionary_size = 25; 
    read_dictionary(test, dictionary_size); 

    return 0; 
} 

輸出(精確值是,當然,依賴於實現,這純粹是爲了示例的目的):

4 
4 
+1

WeaselFox的答案對你有意義嗎?如果它只是被一個指針腐爛,那麼他所說的不應該是真的。我有點困惑 – cost 2012-04-29 05:31:28

+0

在第一個中,sizeof(ar_dictionary)會返回sizeof(void *)嗎? – Spidey 2012-04-29 05:31:48

+1

多維數組的工作方式與使用單維的工作方式不同。我不確定這與什麼有關;該問題僅涉及一維數組。 @cos – 2012-04-29 08:36:05

1

我總是雖然這使固定大小C++數組是C++的「半焙烤」功能。例如,忽略大小匹配或只能夠指定第一個索引的大小,等等。直到最近我學這個成語:

template<size_t N1, size_t N2> // enable_if magic can be added as well 
function(double(&m)[N1][N2]){ 
    ... do something with array m...knowing its size! 
} 

參考:Can someone explain this template code that gives me the size of an array?