Puntatori e strutture

di Anonimizzato21995 il
17 risposte
Vorrei dei chiarimenti circa un passaggio in questo programma
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

---

Nella riga [code]  PPersona lista = NULL;
viene dichiarato "lista" come puntatore a struttura TPersona grazie alla definizione del tipo PPersona.
Però, nella riga
      insert(nome, cognome, eta, &lista);
entra, come argomento della funzione "&lista". Essendo "lista" di per se puntatore, nella funzione entra l'indirizzo di un puntatore? qual è il senso?
Conseguentemente non capisco il senso della scrittura "PPersona *pl" nella riga
void insert(char * nome, char *cognome, int eta, PPersona *pl)
. Potete chiarire il tutto?

17 Risposte

  • Sì, è un puntatore al puntatore (e si scrive appunto PPersona *)

    Serve a poter modificare il puntatore passato.
  • E il puntatore a puntatore "pl" a che punta?
    All'indirizzo di memoria occupato dal puntatore "lista" che a sua volta puntava a NULL ?
  • La funzione insert() usa pl per far sapere al chiamante dove si trova la memoria che è stata allocata dinamicamente, e lo fa copiando nello spazio di memoria puntato da pl il puntatore alla memoria allocata.
  • Si chiama puntatore a puntatore proprio perché il primo punta alla zona di memoria dove c'è il secondo.
  • "pl" punta alla zona di memoria dove c'è "lista", quindi?
  • No. pl punta in memoria dove c'è il puntatore alla lista.

    Doppio puntatore

    Mi sa che quello che ha scritto AldoBaldo ti ha confuso
  • In termini facili: nel main viene dichiarato un puntatore a struttura di nome "lista".
    "lista" si trova a Roma e non punta a nulla (almeno all'inizio)
    pl è un puntatore a puntatore, quindi punta a Roma?
    Giusto?
  • Se per te sono termini "facili" ... (per me sbagliati) ... comunque sì ... qualsiasi sia "Roma" ...

    pl punta alla zona di memoria dove è posizionato un puntatore alla struttura. Non c'è molto altro da dire.
  • Okey perfetto, quindi la riga
    curr = *pl;
    come si traduce?
    è come dire che faccio puntare a "curr" la zona di memoria puntata da pl, ovvero l'indirizzo del puntatore "lista"?
    Oppure curr punta a Null, ovvero a ciò a cui puntava "lista"?
    Non mi è molto chiaro.. Chi è (*pl)?
  • Scusa Francesco ma tu li hai studiato i puntatori, in generale, non parlo di quelli doppi ...

    Con

    *pl

    dereferenzi il puntatore e ottieni ciò a cui il puntatore sta puntando ANCHE se è un altro puntatore ciò a cui sta puntando. Ovvero, dal secondo puntatore ottieni il primo.
  • Si, certo, conosco l'operatore *
    La riga pone "curr" uguale all'oggetto puntato da pl.
    Pl punta ad un puntatore, ovvero "lista" che a sua volta punta a Null.
    Quindi è come eguagliare "curr" a "lista", adesso curr punta alla stessa cosa a cui punta "lista", ovvero a Null.
    Ho capito bene?
  • Sì ...
  • E' come se fosse una caccia al tesoro... "vai lì, che ci trovi un bigliettino dove ti si dice dove trovare quel che cerchi!".

    Oregon, nel mio commento precedente son stato corretto e preciso (molto più che in questo). In italiano.
  • Non è la funzione che fa sapere al chiamante qualcosa, semmai è il chiamante che fornisce una informazione alla funzione.
Devi accedere o registrarti per scrivere nel forum
17 risposte