2016-06-28 2 views
0

Рассмотрим следующие функции C/C++:Декларирование размер входного массива в C++ функции

void print_array_1(int arr[4]) { 
    for (int i = 0; i < 4; ++i) { 
     std::cout << arr[i] << std::endl; 
    } 
} 

void print_array_2(int arr[]) { 
    for (int i = 0; i < 4; ++i) { 
     std::cout << arr[i] << std::endl; 
    } 
} 

При переходе в массиве четыре элемента в каждой функции, они оба делают то же самое.

Есть ли какие-либо реальные различия? arr - это всего лишь указатель на кусок памяти, поэтому кажется, что они должны быть эквивалентными.

+0

Альтернативный обман: https://stackoverflow.com/questions/1328223/when-a-function-has-a-specific-size-array-parameter-why-is-it-replaced-with-ap –

ответ

2

Нет, нет никакой разницы.

Формальный аргумент

int arr[4] 

распадается только

int* arr 

Это означает, что вы можете рассматривать его как изменяемый переменнуюуказатель внутри функции, и что также означает, что вся информация о размер массива пропал.


Один из способов определить и требуют определенного размера массива для формального аргумента, является использование std::array:

void foo(std::array<int, 4> const& arr) 

Другой способ передать необработанный массив по ссылке:

void bar(int (&arr)[4]) 
+0

Итак 'arr [ i] 'становится' * (arr + i) ', правильно? – dorukayhan

+0

Да, по определению. –

+0

@ Cheersandhth.-Alf Или если вы хотите быть более общим, пропустите шаблонную ссылку не-типа, 'template void bar (T (& arr) [N]);' – vsoftco

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