Dichiarazione e definizione di puntatore

di il
5 risposte

Dichiarazione e definizione di puntatore

Se ho una funzione come questa che mi cancella una lista
struct elem {
   int inf;
   elem* pun;
};

...
        elem* tmp;
	while (testa!=NULL) {
		tmp=testa;
		testa=testa->pun;
		delete tmp;
        }

testa è il puntatore di accesso alla lista.
Mi chiedo se tmp lo dichiaro e lo definisco con la stessa istruzione all'interno del while che differenza ci sia.
elem* tmp è solo una dichiarazione per cui non c'e' allocazione di memoria mentre con tmp=testa viene riservato spazio di memoria per tmp il quale ospiterà l' indirizzo che ha testa.
Se invece mettessi elem* tmp=testa all'interno del while, ogni volta che eseguo il ciclo il puntatore verrà ridefinito e inizializzato.
Corretto? Funzionalmente non dovrebbe cambiare una virgola ma secondo voi qual è la strada più corretta?

5 Risposte

  • Re: Dichiarazione e definizione di puntatore

    zio_mangrovia ha scritto:


    elem* tmp è solo una dichiarazione per cui non c'e' allocazione di memoria ...
    Ma chi l'ha detto? Non c'è allocazione esplicita ma lo spazio per la variabile è creato eccome.

    La dichiarazione:
    elem *tmp;

    equivale a:
    auto elem *tmp;

    perché le variabili locali sono trattate come variabili automatiche se non diversamente specificato. Questo significa che la variabile tmp sarà allocata al momento della sua dichiarazione e automaticamente deallocata all'uscita del blocco in cui è stata dichiarata. Allora capirai perché è preferibile dichiarare le variabili al di fuori di un ciclo di reiterazione.
  • Re: Dichiarazione e definizione di puntatore

    Non hai ancora chiari molti concetti di base

    La variabile tmp occupa spazio in tutti i casi
  • Re: Dichiarazione e definizione di puntatore

    oregon ha scritto:


    Non hai ancora chiari molti concetti di base

    La variabile tmp occupa spazio in tutti i casi
    Mi ero ispirato a questo sito

    Sapevo che la differenza sostanziale tra dichiarazione e definizione è che quest'ultima alloca memoria.

    Ma ho fatto confusione, he ho preso un abbaglio perchè nel caso prima citato dichiarazione e definizione coincidono, quindi la memoria viene sempre riservata all'atto della compilazione. E' solo nel caso di pura dichiarazione che non c'e' allocazione di memoria per esempio quando si parla di prototipi di funzione.
  • Re: Dichiarazione e definizione di puntatore

    Unqualunque ha scritto:


    Ma chi l'ha detto? Non c'è allocazione esplicita ma lo spazio per la variabile è creato eccome.
    Ho preso una cantonata !!!
    Allora capirai perché è preferibile dichiarare le variabili al di fuori di un ciclo di reiterazione.
    Perché la visibilità rimarrebbe circoscritta al blocco iterativo, certo ma se la usi soltanto nel blocco non potrebbe andar bene? Vedi l'esempio a cui alludevo.
  • Re: Dichiarazione e definizione di puntatore

    La ragione sta nel fatto che dichiarata fuori dal corpo del ciclo la crei una sola volta, dichiarata all'interno del ciclo la crei ad ogni iterazione. Nella pratica ciò non avviene grazie all'ottimizzazione del compilatore che la crea una sola volta.
Devi accedere o registrarti per scrivere nel forum
5 risposte