void display(int arr[], int n)
Это ложь, но это не твоя вина.
Во время компиляции он автоматически переписывается в:
void display(int* arr, int n)
То есть, хотя массивы не являются указателями , старые глупые функции C могут заставить нас думать, что они есть! Невозможно передать массив по значению, поэтому вы просто передаете указатель на первый элемент.
Таким образом, вы делаете sizeof(int*)
.
Вместо этого я предлагаю использовать sizeof(*arr) * n
или передать ссылку в массив:
#include <iostream>
template <std::size_t N>
void display(const int (&arr)[N])
{
std::size_t i = 0;
for (std::size_t i = 0; i < N; i++)
std::cout << i << " : " << arr[i] << '\n';
}
int main(){
int arr[9] = {2,5,3,8,5,4,6,1,7};
display(arr);
}
* * & Тысячу двадцать-три hellip; или переписать вашу функцию вместо пары итераторов:
#include <iostream>
#include <iterator>
template <typename It>
void display(const It begin, const It end)
{
std::size_t i = 0;
for (It it = begin; it != end; ++it)
std::cout << i++ << " : " << *it << '\n';
}
int main(){
int arr[9] = {2,5,3,8,5,4,6,1,7};
display(std::begin(arr), std::end(arr));
}