Originariamente inviato da Vic_Mackey
Salve,mentre facevo un esercizio per un esame mi è venuto fuori un dubbio sui puntatori e il passaggio per riferimento.L'esercizio richiede di unire due stack mantenendo l'ordine (essi contengono numeri interi inseriti già in maniera ordinata) in un terzo stack.
Questi sono alcuni prototipi delle funzioni che operano sugli stack:
codice:
void stack_pop(nodo_pilaPtr *testa_pila,int *elemento);
void stack_push(nodo_pilaPtr *testa_pila,int elemento);
Stack_pop estrae l'elemento in testa dallo stack,stack_push lo inserisci,entrambe ricevono testa_pila(che è un puntatore) come argomento mediante passaggio per riferiferimento.
Questo è come ho dichirato il tipo nodo_pilaPtr:
codice:
struct pila{
int info;
struct pila *next;
};
//Creazione tipo pila
typedef struct pila nodo_pila;
typedef nodo_pila *nodo_pilaPtr;
Questo è il prototipo della funzione che effettua il merge:
codice:
void merge_stacks(nodo_pilaPtr stack1,nodo_pilaPtr stack2,nodo_pilaPtr *stack3);
e qui com'è chiamata nel main:
codice:
merge_stacks(stack1,stack2,&stack3);
e in questa function per errore alla fine ho scritto questo pezzo di codice (serve ad invertire lo stack,ma in realtà non serve ai fini dell'esercizio)
codice:
while(stack_vuoto(temp_stack)==0){
stack_pop(&temp_stack,&item1);
stack_push(stack3,item1);
}
dove se notate passo stack3 alla funzione push per copia,e funziona tutto alla perfezione(lo stack viene invertito anche se non serve); in realtà non dovrei passare alla funzione &(*stack3) ??
Perchè stack3 è un paramentro passato per riferimento dal main alla funzione che fa il merge,il C di regola prevede che ogni elemento del genere venga preceduta da * (e infatti se provo ad usar stack3 senza * mi da errore).. tuttavia come mai in quel caso funziona?