[C++] Passare a una funzione una Linked List Locale

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

[C++] Passare a una funzione una Linked List Locale

Messaggio da JhW »

Salve a tutti,

Perché se ho una LinkedList *head dichiarata nel main e devo passarla a una funzione si utilizza
Esempio:
Inizializza(&head); invece di... Inizializza(head);
e nella testata della funzione
Esempio:
void Inizializza (LinkedList **head) invece di: void Inizializza (LinkedList *head)
{ ....... }

non riesco a capire che bisogno c'è di passare alla funzione l'indirizzo di memoria della variabile che punta alla struttura LinkedList :muro:
spero che qualcuno possa chiarirmi le idee... Grazie in anticipo
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++] Passare a una funzione una Linked List Locale

Messaggio da 1001001 »

Ciao! La funzione prende in ingresso un puntatore a head perché le modifiche che vengono fatte a head devono "uscire" dalla funzione quando il controllo ritorna al main
"I find your lack of faith disturbing."
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

Re: [C++] Passare a una funzione una Linked List Locale

Messaggio da JhW »

Sì, ma non basterebbe passare head dato che punta alla struttura? Che senso ha passare l'indirizzo di memoria del puntatore che punta a head?
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++] Passare a una funzione una Linked List Locale

Messaggio da 1001001 »

Se tu passi head (cioè lo passi per copia) nella funzione avrai una copia del puntatore alla struttura. Ora, immagina che ad esempio la lista sia vuota quando chiami la funzione e quindi head valga NULL. La funzione Inizializza fa tutte le sue cose e alla fine head puntarà a una certa cella di memoria che contiene il primo elemento della lista. Ma è l'head della funzione, non l'head che c'è nel main, perché quando hai chiamato la funzione ne hai fatto una copia. L'head che c'è nel main è rimasto a NULL. Se invece gli passi un puntatore a head le modifiche nella funzione si ripercuotono sul valore nel main.
"I find your lack of faith disturbing."
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

Re: [C++] Passare a una funzione una Linked List Locale

Messaggio da JhW »

Quindi se il tuo ragionamento è corretto, qesto programma dovrebbe stampare10 ma a me da 70

Codice: Seleziona tutto

#include <iostream>

using namespace std;

struct LinkedList
{
	int info;
	LinkedList *next;
};

void Inizializza(LinkedList *);

int main()
{
	LinkedList *head;
	head = new LinkedList;
	head->info = 10;
	Inizializza(head);
	
	cout << "valore: " << head->info;

	return 0;
}

void Inizializza(LinkedList *head)
{
	head->info = 70;
}
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++] Passare a una funzione una Linked List Locale

Messaggio da 1001001 »

Rileggi bene quello che ho scritto: il problema è se la funzione deve cambiare head, non ciò a cui head punta.

Esempio: head nel main è inizializzato a NULL e NULL rimane anche dopo la chiamata a Inizializza

Codice: Seleziona tutto

#include <iostream>

using namespace std;

struct LinkedList
{
   int info;
   LinkedList *next;
};

void Inizializza(LinkedList *);

int main()
{
   LinkedList *head = NULL;
   Inizializza(head);
   
   if (head == NULL)
   {
       cout << "Head is null" << endl;
   }
   else
   {
       cout << "Head is not null and info = " << head -> info <<  endl;
   }

   return 0;
}

void Inizializza(LinkedList *head)
{
   head = new LinkedList;
   head->info = 70;
}
(NOTA: nel tuo codice, e nel mio, andrebbe messa anche la deallocazione tramite chiamata a delete, ma al momento non è quello di cui stiamo parlando, quindi tralasciamo)
"I find your lack of faith disturbing."
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti