Q:

Передача массива в функцию используя ссылку

Есть массив, состоящий из 3-х элементов. Нужно передать массив в функцию(которая посчитает сумму элементов) тремя разными способами.
Как передавать указателем и просто аргументом(да, я понимаю что это тоже указатель) я понимаю, но как использовать ссылку?
    #include <iostream>

int sum1(int arr[])
{
    int sumArr = 0;

    for (int i = 0; i < 3; i++)
    {
        sumArr += arr[i];
    }
    return sumArr;
}

int sum2(int* arr)
{
    int sumArr = 0;

    for (int i = 0; i < 3; i++)
    {
        sumArr += *(arr + 1);
    }
    return sumArr;
}

int sum3(int &arr)
{
    int sumArr = 0;

    for (int i = 0; i < 3; i++)
    {
        ???
    }
    return sumArr;
}

A:

В Вашем случае нужно написать так: int sum3(int (&arr)[3]). В таком подходе есть недостаток: ваша функция может принимать только массивы длиной в три элемента.
Обращение к элементам такое же, как и в функции sum1
int sum3(int (&arr)[3])
{
    int sumArr = 0;

    for (int i = 0; i < 3; i++)
    {
        sumArr += arr[i];
    }
    return sumArr;
}

PS. Ваши функции не изменяют массив, поэтому имеет смысл обьявлять параметр arr как const.

Так же можно написать шаблонную функцию:
template<typename Type, size_t N>
Type sum(Type (&arr)[N])
{
    Type sumArr {};

    for (int i = 0; i < N; i++)
    {
        sumArr += arr[i];
    }
    return sumArr;
}

