Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] Passaggio per riferimento di un puntatore

    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?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590

    Re: [C] Passaggio per riferimento di un puntatore

    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?
    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).
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.