Il C lavora solo e soltanto con i passaggi dei valori da una funzione ad un'altra tramite valore.
Ciò nonstante esiste qualche trucchetto che mi consente di fare in modo che un valore che passo come parametro ad una funzione venga poi effettivamente modificato anche all'interno dell'ambiente (ovvero della funzione) chiamante.

Se opero con tipi di dati predefiniti non c'è problema, ma se ad esempio dovessi lavorare con puntatori a liste??

Ad esempio:

dichiaro una struttura del tipo
codice:
struct lista {
 int d;
 struct lista *next;
};
e tramite la funzione creaLista popolo la lista e restituisco un puntatore
codice:
struct lista *creaLista(int val) 
{
 if (val < 1)
  return NULL;
 else {
  struct lista *l = (struct lista *) malloc(sizeof(struct lista));
  l->d = val--;
  l->next = creaLista(val);
  return l;
 }
   
}
adesso voglio crearmi una funzione che chiamerò cambiaElemento la quale prenderà come input un intero che rappresenta il numero di spostamenti che voglio effettuare e il puntatore alla lista.
La funzione avrà ritorno void, ma io dovrò modificare l'indirizzo a cui punta il puntatore alla lista (che chiamo l e che è dichiarato nel main) in modo tale che la nuova testa della lista non sarà più il primo effettivo elemento della lista, ma sarà determinata dal numero di spostamenti che dovrò fare (indicati da val) a partire dal primo elemento della lista.

esempio:
se da 1->3->5->4->3->NULL
dico che val = 2 allora il primo elemento della lista diventerà 5 e la lista sarà cosi:
5->4->3->NULL


codice:
void cambiaElemento(int, struct lista *);
Tutto ciò per non usare i return e per imparare come si fa un passaggio di parametri per riferimento.

Ma come faccio??
Mi date una mano?

Grazie