Można pobawić się operatorem sizeof(), jak to zrobił Bondrusiek... Należy tutaj jednak podkreślić, że jeśli variables została przekazana do funkcji jako argument, to taki zabieg nie zwróci "oczekiwanej" liczby elementów tablicy, stąd też nie można zrobić sobie sparametryzowanej funkcji, która będzie zwracała wielkość tablicy (przynajmniej w taki "naiwny" sposób*). Powód? Przy przekazywaniu tablicy do funkcji, jest ona konwertowana na wskaźnik. Wtedy operator sizeof(variables) zwróci nie rozmiar całej tablicy, lecz wskaźnika właśnie.
* - jeśli już ktoś pragnąłby coś takiego napisać, to jest to możliwe. Wystarczy użyć "sztuczki" z szablonem. Dla każdego rozmiaru tablicy zostanie wygenerowana osobna konkretna forma funkcji szablonowej.
template <typename T, size_t size>
constexpr size_t array_size(T(&)[size])
{
return size;
}
Zupełnie inną sprawą jest to, że w zasadzie niezależnie od tego, czy tablica jest statyczna czy dynamiczna, programista posiada (a przynajmniej powinien) informację o rozmiarze tablicy. Przecież kompilator nie ustala rozmiaru tablicy na podstawie aktualnego położenia Marsa względem Słońca, programista jawnie w kodzie źródłowym wskazuje rozmiar (dla tablic statycznych), a do utworzenia tablicy dynamicznej posiadamy liczbę elementów pobraną zapewne z jakiegoś wejścia. Także potrzeba istnienia takiej funkcji to dla mnie sygnał, że coś w kodzie jest nie tak jak trzeba.
Najprostszym i najczystszym rozwiązaniem jest tutaj... biblioteka standardowa: std::array, std::vector i pokrewne.