Ritornare puntatori nelle funzioni?

di il
8 risposte

Ritornare puntatori nelle funzioni?

Non ho ancora capito benissimo i puntatori con le funzioni. Dal punto di vista pratico, cosa succede quando ritorniamo un puntatore alla fine di una funzione? Ad esempio abbiamo appena creato una lista con un algoritmo di inserimento in coda: alla fine della funzione crea il puntatore p punta all'ultimo nodo della lista.
Cosa succede se a questo punto facciamo "return(p)"?

il prototipo della funzione in esempio può essere ad esempio questo:

typedef lista* ptr_lista;
//ora il prototipo della funzione del tipo appena creato, che cioè ritornerà un puntatore a lista
ptr_lista crea(ptr_lista head, ptr_lista p);

8 Risposte

  • Re: Ritornare puntatori nelle funzioni?

    crea il puntatore p punta all'ultimo nodo della lista.
    Cosa succede se a questo punto facciamo "return(p)"?
    Semplicemente si restituisce il puntatore alla fine della lista.
    Ma esattamente che perplessità hai?
  • Re: Ritornare puntatori nelle funzioni?

    Per capire bene cosa ritorna dovresti scrivere la funzione, perchè di solito non ha molto senso ritornare il puntatore alla fine della lista.

    Fai vedere il codice e spiega meglio il dubbio che hai sul puntatore.
  • Re: Ritornare puntatori nelle funzioni?

    Non riesco a figurarmi bene la situazione.
    Nell'esempio che ho scritto, quando faccio return(p1), ritorna il puntatore p1 all'ultimo nodo, ok. Ma se a questo nel main, dopo la chiamata di funzione scrivo "cout << p1->val" (il campo val contiene un intero), perchè mi da errore? Dal momento che è stato ritornato un puntatore all'ultimo nodo, dovrebbe stamparmi il campo val dell'ultimo nodo, o no?

    @SVNiko: in realtà avevo fatto un esempio banale per capire come funzionasse. Cioè: se in una funzione ritorniamo un bool, al main arriverà o true o false; se ritorniamo un intero n, al main arriverà il valore di n; se ritorniamo invece un puntatore a lista, cosa arriva al main?

    Ti metto comunque un esempio di codice (nell'esempio che ti metto sotto c'è un inserimento in testa, ma il dubbio che ho è sempre quello):
    
    ptr_lista head_insert (ptr_lista head, int el){
        ptr_lista tmp_head ;
        tmp_head = new lista ;
        tmp_head->val = el ;
        tmp_head->next = head ;
        return(tmp_head) ;
    }
    
    cosa vuol dire return(tmp_head)?
    io posso chiamare la funzione con:
    
    cout << head_insert(head, el);
    
    Cosa stamperebbe?
    Capisco che è un po' contorta la cosa, ma ho questo enorme dubbio che non capisco proprio... poi magari è una cavolata, ma al momento non capisco proprio
  • Re: Ritornare puntatori nelle funzioni?

    Se ti interessa il valore dovresti scrivere

    cout << head_insert(head, el)->val;
  • Re: Ritornare puntatori nelle funzioni?

    Alessio Innocenzi ha scritto:


    se ritorniamo un intero n, al main arriverà il valore di n; se ritorniamo invece un puntatore a lista, cosa arriva al main?
    Il puntatore alla lista, ovvero l'indirizzo del blocchetto della lista che hai ritornato.

    Quello che ritorna al tuo codice è l'indirizzo alla testa della lista, come più logico sia.

    Lasciamo perdere la lista facciamo una piccola digressione!
    Per capire bene i puntari vedila così:

    Sia int x; una variabile intera, adesso nella memoria sarà riservato spazio per poter memorizzare un intero, questa variabile sarà memorizzata a partire da un ben determinato indirizzo .
    Sia int *ptx; il puntatore a una variabile intera in memoria sarà riservato spazio per poter memorizzare un indirizzo.

    Adesso quando scrivi:
    ptx = &x; dici che vuoi memorizzare in ptx il valore dell'indirizzo di partenza della variabile x.

    Quindi concludendo in ptx hai l'indirizzo della variabile x, di qui puoi entrare nella variabile x tramite il suo puntatore proprio perchè hai l'indirizzo, in realtà anche perchè sai che è di tipo int, cioè sai quanti byte in memoria sono riservati per scrivere quella variabile.

    Tornando alla tua lista, o in generale al valore di ritorno di una funzione, tu ritorni giustappunto l'indirizzo e poichè sai che si tratta di un indirizzo al tipo lista, puoi operare.
    Spero sia più chiaro e non ti abbia confuso ulteriormente.
  • Re: Ritornare puntatori nelle funzioni?

    Grazie ad entrambi, davvero, ora ho le idee molto più chiare...
    Quindi se io al termine della funzione head_insert, con return(tmp_head), nel main mettessi p1 = head_insert(head, el), sarebbe come dire che il puntatore p1 punta alla stessa cella di memoria puntata da tmp_head, che è stata ritornata alla fine di head_insert, giusto?

    Quindi se io scrivessi nel main:
    
    //metto solo un pezzo del main
    ptr_lista p1;
    ...
    ...
    p1 = head_insert(head, el);
    cout << p1->val;
    
    In questo modo stamperebbe il valore contenuto nel campo val del primo nodo della lista, che era lo stesso puntato da tmp_head, giusto?
  • Re: Ritornare puntatori nelle funzioni?

    Esatto!

    C'è solo da vedere se hai accesso a quel campo, in quel caso non puoi stampare nulla. Ma concettualmente funziona.
  • Re: Ritornare puntatori nelle funzioni?

    Perfetto, grazie
Devi accedere o registrarti per scrivere nel forum
8 risposte