2012-04-29 3 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

Он имеет нативную способ узнать размер массива : Этот метод. Если вы расскажете ему, насколько велика массив, он будет считать, что это так. –

+1

«25» в объявлении параметра игнорируется компилятором. Это то же самое, что и 'string ar_dictionary []'. –

+0

@ H2CO3 Нет ничего, что могло бы сделать функция с этим номером, и каким-либо образом компилятор не мог проверить, что передается ему то, что размер ... – cost

ответ

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

+1

Доступ к массиву в [x] [y] означает доступ к элементу в строке y и столбце x. для этого вам нужно знать, какова длина строки. 'arr [1] [2]' совпадает с 'arr [2 * 10 + 1]'. – WeaselFox

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; 
} 

Output (точное значение, конечно, зависит от реализации, это чисто для примера):

4 
4 
+1

Ответы WeaselFox имеют какой-то смысл для вас? Если он просто разложен указателем, то то, что он сказал, не должно быть правдой. Я немного смущен – cost

+0

В первом, sizeof (ar_dictionary) также вернет sizeof (void *)? – Spidey

+1

Массивы с несколькими параметрами работают иначе, чем те, которые имеют один размер. Я не уверен, что с этим связано. вопрос касается только одномерных массивов. @cos –

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?

Смежные вопросы