Teraz zwraca adres do napisu. Tyle, że operator<< cout-a działa w taki sposób, że jeśli dostanie wskaźnik na char to próbuje wypisać napis (tzn. kolejne bajty - litery - od podanego adresu kończąc gdy natrafi na znak '\0'). Żeby wypisać adres, po prostu przekonwertuj wartość zwróconą przez funkcje na void*.
cout << static_cast<void *>(maxn(tab3, 5));
Druga sprawa :
char *tab3[] = {"Korea", "Panie Janie", "Rano wstan", "ding dang dong", "PA"};
Czegoś takiego nie rób. Łańcuchy znaków przypisane w taki sposób do wskaźnika :
char * str = "slfhksdhf";
są zapisywane w pamięci tylko do odczytu i próba ich modyfikowania to UB.
http://stackoverflow.com/questions/5343721/cant-modify-char-memory-access-violation
Dlatego albo dodaj const do typu tablicy (żebyś przypadkiem nie próbował modyfikować tych stringów), albo zastosuj sie do tego co napisał w odpowiedzi gość w zalinkowanym temacie na SO.