Pagina 1 di 1

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

Inviato: lunedì 19 maggio 2014, 17:46
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

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

Inviato: martedì 20 maggio 2014, 0:14
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

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

Inviato: martedì 20 maggio 2014, 11:02
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?

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

Inviato: martedì 20 maggio 2014, 11:41
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.

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

Inviato: martedì 20 maggio 2014, 13:32
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;
}

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

Inviato: martedì 20 maggio 2014, 15:35
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)