Ciao a tutti, fra 2 giorni avrò l'esame su fondamenti di informatica ed ho un grosso dubbio, vi prego aiutatemi!

Non riesco a capire quando usare il puntatore singolo rispetto a quello doppio nelle strutture dati tipo liste ed alberi. Io ragiono in questo modo:
Se per esempio ho questo:

typedef struct lista_ele{
int ele;
lista_ele *prox;
}lista;

chiamo la funzione conta che mi scorre una lista in questo modo:

void conta(lista *pun){
int i=0;

if(pun->prox!=NULL){
pun=pun->porx;
i++;
}
}
}

quando il controllo torna al client, il puntatore alla lista è modificato o no?
e se invece la scrivo così:

lista conta(lista *pun){
int i=0;

if(pun->prox!=NULL){
pun=pun->porx;
i++;
}
}
return pun;
}

o anche così:

lista conta(lista *pun){
int i=0;
lista *temp=pun;

if(temp->prox!=NULL){
temp=temp->porx;
i++;
}
}
return pun;
}

Spiegatemi quali delle tre funzionano senza modificare il puntatore alla lista e perchè!!!!!

aiutatemi vi prego, spiegatemi questi dubbi...cmq questa è la prima domanda poi ne ho un altra sul doppio puntatore!