Ho cambiato il meno possibile per permetterti di capire meglio, questo è funzionante (senza controlli sull'input, non ho aggiunto cose di questo tipo), ho solo modificato i valori di ritorno e di argomento delle funzioni. Per fare come facevi tu avresti dovuto conoscere e usare i puntatori, ma non credo... quindi ti ho lasciato i passaggi di parametri per valore... per spiegazioni e tutto, sono qui   
#include <iostream>
#include <cstdlib>
using namespace std;
const int nmax=100;
//prototipi di funzioni
void letturavettore (int v[],int r);
void trovaotto (int v[], int n);
int somma (int v[], int n);
float mediavoti (float s,int n);
void stampamedia (float media);                           
//programma per la media dei voti
int main()
{
int v[nmax];
int n;
float s, media;
do
{
   cout<<" inserisci la dimesione del vettore"<<endl;
   cin>> n;
   }
   while (n>nmax);
   letturavettore (v, n);
   trovaotto(v, n);
   s=somma(v,n);
   media=mediavoti(s, n);
   stampamedia(media);
   system ("PAUSE");
   return 0;
}
//funzione letturea vettore
void letturavettore (int v[], int n)
{
   for(int i=0; i<n; i++)
   {
      cout<< "inserisci il valore "<<i<<" :";
      cin>> v[i];
   }
}
//trova e stampa i valori di 8
void trovaotto (int v[], int n)
{
int j=0;
for (int i=0; i<n; i++)
   {
   if (v[i]==8)
   j++;
}
cout<<"gli otto sono  "<<j<<endl;
}
//somma dei voti, intero: essendo i voti interi, la somma deve essere un intero
int somma(int v[],int n)
{
   int s=0;			// non passata come argomento, dichiarata qui e inizializzata a 0
   for (int i=0; i<n; i++)
   {
      s=s+v[i];
   }
	return s;		// passaggio di ritorno per valore
}
// media voti: ovviamente float
float mediavoti (float s, int n)
{
	float media;
   media=s/n;			// variabile media dichiarata qui, non passata come argomento!!!
	return media;
}
//stampa media
void stampamedia(float media)
{
   cout<<"la media dei voti e' "<<media<<endl;
}