Конечно можно и через указатель и через ссылку, смотря для чего?)
void foo(int* ptr) тогда вызов выглядит так --> foo(arr + 3)
или
void foo(int& ptr) и вызов --> foo(arr[3]) это более безопасный вариант, без доступа к соседним ячейкам памяти, без копирования, но с возможностью изменения значения в самом массиве, ну, конечно, если не использовать константность, хотя и это 100% гарантии не дает const_cast никто не отменял)) Так что думаю вам и обычной
void foo(int value)
должно хватить.