Я предполагаю, что внутреннее кастинг происходит, когда мы пишем: arr[i] (что эквивалентно *(arr+i)). Потому что i может быть, например, short, int или long или беззнаковый вариант любого из этих трех.
Итак, мой вопрос прост: какой тип должен i быть таким, чтобы не происходило никакого внутреннего преобразования? Чтобы код мог работать наиболее эффективно?
Грубая догадка: size_t?