PDA

Visualizza la versione completa : [C] Passaggio per riferimento di un puntatore


Vic_Mackey
29-08-2013, 16:59
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:

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:


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:

void merge_stacks(nodo_pilaPtr stack1,nodo_pilaPtr stack2,nodo_pilaPtr *stack3);
e qui com'Ŕ chiamata nel main:


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)


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?

Scara95
29-08-2013, 18:13
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:

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:


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:

void merge_stacks(nodo_pilaPtr stack1,nodo_pilaPtr stack2,nodo_pilaPtr *stack3);
e qui com'Ŕ chiamata nel main:


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)


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?

E' semplicemente un puntatore. Il C non ti obbliga a fare nulla, sei tu che se vuoi usare il tuo nodo_pilaPtr che hai nel main devi deferenziare il puntatore. Tuttavia essendo che all'altra funzione devi comunque passare un puntatore non ci sono problemi, puoi non deferenziarlo.
Comunque & e * sono uno l'inverso dell'altro: & ottiene un'indirizzo di memoria, * deferenzia un indirizzo di memoria (per ottenere il valore puntato).

Loading