Passaggio per riferimento o pervalore-risultato

di il
12 risposte

Passaggio per riferimento o pervalore-risultato

Dato il seguente frammento
{ int a = 1;
int b = 2;
void p(int x, y)
{ x = x + 2;
a = x * y;
x = x + 1; }
p(a,b);
print(a);
}

Come cambia la semantica in caso di passaggio per riferimento o pervalore-risultato?e per valore
ho bisogno di aiuto urgente ho un esame a giorni e devo superarlo!
per riferimento riesco a farlo ma gli altri e due non li ho capiti proprio aiutooooo!!

12 Risposte

  • Re: Passaggio per riferimento o pervalore-risultato

    Sei sicuro che il quesito sia ben posto? Messa così non ci capisco niente! Ad esempio, se la variabile a è un int e scrivi print(a)... da dove salta fuori "print"? Forse intendevi printf( "%d", a )?

    Puoi formulare la tua domanda in un modo più chiaro?
  • Re: Passaggio per riferimento o pervalore-risultato

    Comunque, provo a intuire...
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int a = 1; // hai un intero a che vale 1
        int b = 2; // hai un intero b che vale 2
    
        // definisci una funzione p che fa delle operazioni
        // sul VALORE di a e di b; quella funzione riceve
        // come parametri delle COPIE di a e di b, chiamandole
        // rispettivamente x e y
        void p( int x, int y ) {
            x = x + 2;
            a = x * y;
            x = x + 1;
        
            // x e y vengono distrutti uscendo dal "corpo" della funzione
        }
        
        // chiami la funzione p, passando a come primo parametro
        // e b come secondo parametro; ne consegue che ad x viene
        // assegnato il valore di a (cioe' 1) e ad y viene assegnato il
        // valore di b (cioe' 2); a e b NON vengono modificati
        p( a, b );
        
        // ne consegue che all'interno della funzione p() succede
        // questo:
        // x = x + 2;     (diventa x = 1 + 2; dopo, x vale 3)
        // a = x * y;     (diventa a = 3 * 2; dopo, a vale 6)
                       
        printf( "%d\n\n", a ); // visualizzi il valore di a
    
        return 0;
    }
    La variabile a viene modificata perche' il suo "scopo" comprende anche il corpo della funzione p(); se la funzione p() fosse "esterna" al corpo del main(), a = x * y non potrebbe essere eseguito perche' nel "corpo" della funzione p() non esisterebbe alcuna variabile di nome a.
    #include <stdio.h>
    #include <stdlib.h>
    
    // definisci una funzione p che fa delle operazioni
    // sul VALORE di a e di b; quella funzione riceve
    // come parametri delle COPIE di a e di b, chiamandole
    // rispettivamente x e y
    void p( int x, int y ) {
        x = x + 2; // (diventa x = 1 + 2; dopo, x vale 3)
        a = x * y; // impossibile, perche' non esiste una
                   // variabile di nome a in questo "scopo"
        x = x + 1; // (diventa x = 3 + 1; dopo, x vale 4)
        
        // x e y vengono distrutti uscendo dal "corpo" della funzione
    }
    
    int main() {
        int a = 1; // hai un intero a che vale 1
        int b = 2; // hai un intero b che vale 2
        
        // chiami la funzione p, passando a come primo parametro
        // e b come secondo parametro; ne consegue che ad x viene
        // assegnato il valore di a (cioe' 1) e ad y viene
        // assegnato il valore di b (cioe' 2)
        p( a, b );
                       
        printf( "%d\n\n", a ); // visualizzi il valore di a, cioe' 1
                               // perche' a non e' stato modificato
    
        return 0;
    }
    Questo per quel che riguarda il passaggio per valore.

    Nella prossima risposta provo a ragionare sul passaggio per indirizzo nelle stesse circostanze.
  • Re: Passaggio per riferimento o pervalore-risultato

    No la traccia è proprio cosi ...ci da il frammento e bisogna calcolare passaggio per indirizzoo ,per valore e valore-risultato.
    non c'e' bisogno che mi spiega quella per indirizzo è l'unica che sono riuscita a capire
    però non capisco una cosa tu mi hai riscritto due volte il frammento di codice e hai detto che l'ultimo l hai risolto per valore solo che i risultati non corrispondono o meglio sono invertiti infatti per valore viene 6 mentre per valore risultato 4
  • Re: Passaggio per riferimento o pervalore-risultato

    Porta pazienza, ma non capisco cosa intendi per valore-risultato.

    Avendo preparato l'esempio di cosa succede col passaggio per indirizzo lo riporto ugualmente, anche se mi hai detto che non ti serve (se no cosa l'ho preparato a fare? )
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int a = 1; // hai un intero a che vale 1
        int b = 2; // hai un intero b che vale 2
    
        // definisci una funzione p che fa delle operazioni
        // direttamente su a e b, passati PER INDIRIZZO;
        // quella funzione riceve come parametri informazioni
        // sulla COLLOCAZIONE in memoria di a e di b, chiamando
        // questli indirizzi rispettivamente x e y
        void p( int *x, int *y ) {
            *x = *x + 2; // non modifichi x, ma il CONTENUTO della
                         // memoria che si trova all'indirizzo
                         // indicato da x; quell'indirizzo punta
                         // alla variabile a
            a = *x * *y; // modifichi direttamente la variabile a
                         // che è la stessa variabile sulla quale
                         // si agisce tramite l'indirizzo *x
            *x = *x + 1; // di nuovo, agisci su a perche' x punta
                         // allo spazio di memoria occupato da a
        }
    
        // chiami la funzione p, passando come primo parametro
        // l'INDIRIZZO della memoria occupata da a e come secondo
        // parametro l'INDIRIZZO della memoria occupata da b; ne
        // consegue che *x sara' uguale ad a (cioe' sara' 1) e che
        // *y sara' uguale a b (cioe' sara' 2)
        p( &a, &b );
    
        // ne consegue che all'interno della funzione p() succede
        // questo:
        // *x = *x + 2;     (diventa a = 1 + 2; dopo, a vale 3)
        // a = *x * *y;     (diventa a = 3 * 2; dopo, a vale 6)
        // *x = *x + 1;     (diventa a = 6 + 1; dopo, a vale 7)
    
        printf( "%d\n\n", a ); // visualizzi il valore di a, cioe' 7
    
        return 0;
    }
  • Re: Passaggio per riferimento o pervalore-risultato

    Forse, nella prima risposta, l'esempio dove p() viene posta all'esterno di main() confonde le idee più che chiarirle...
  • Re: Passaggio per riferimento o pervalore-risultato

    Nella prima risposta c'è anche una inesattezza nei commenti: in effetti a viene modificato, ma solo perché subisce direttamente un'operazione nella seconda riga di p(). E' un esercizio davvero strano. Non credo che troverai mai situazioni così "cavillose" in casi di programmazione "reale" (anche se non si può mai dire).
  • Re: Passaggio per riferimento o pervalore-risultato

    Ahahah okay p() è posto all'esterno.
    PASSAGGIO PER VALORE RISULTATO(questa è la spiegazione di questo tipo di passaggio)
    Questa modalità è più complicata della precedente e consiste nella combinazione del passaggio per valore e del passaggio per risultato.
    In entrata di una funzione succede che viene fatta una copia del parametro attuale nel parametro formale appena allocato, dopodiché solo all'uscita della funzione il valore contenuto nel parametro formale viene copiato dentro quello attuale.
  • Re: Passaggio per riferimento o pervalore-risultato

    E qui vengono fuori le mie carenze lessicali dovute a una formazione non accademica, da autodidatta. A mettermi in crisi, probabilmente non è il contenuto di quel che discutiamo, ma i termini che usiamo per discuterli. Che differenza c'è tra "parametro attuale" e "parametro formale"? Sono espressioni che mi confondono. Mi fai un esempio?
  • Re: Passaggio per riferimento o pervalore-risultato

    Se p() è "esterna" al main() NON ci si può usare la variabile a, perchè lo "scopo" di a si limita al corpo del main().
  • Re: Passaggio per riferimento o pervalore-risultato

    Ricerchina. Ora so che differenza c'è tra parametro formale e parametro attuale. In effetti già conoscevo i concetti ma non avevo mai usato quelle definizioni.

    Rimane il dubbio sul significato dell'espressione valore-risultato. Finisce che è un'altra cosa che uso ogni tre per due senza sapere che si chiama così.
  • Re: Passaggio per riferimento o pervalore-risultato

    Innanzitutto ritengo sia opportuno chiarire la seguente peculiarità del linguaggio ideato da K&R: in C esiste solo il passaggio per valore. I parametri formali sostanzialmente sono una copia dei parametri attuali e qualsiasi modifica ad parametro formale, in C, non si riflette sul parametro attuale. Ciò è dimostrato dal seguente frammento di codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    static int f(int a);
    
    int main(void)
    {
    	int x = 10;
    	int 
    	y = f(x);
    	printf("x = %d y = %d\n", x,y);
    	
    	return (EXIT_SUCCESS);
    }
    
    static int f(int a)
    {
    	++a;
    	return a;
    }
    
    Come si nota lanciando l'eseguibile prodotto dalla compilazione del codice di cui sopra ,x parametro attuale, non subisce alcuna modifica contrariamente a quanto avviene per a, parametro formale.
    Se si vuole passare l'indirizzo di una variabile occorre fare uso di un puntatore, un tipo particolare di variabile che serve appunto a memorizzare indirizzi. Passando un puntatore ad una funzione, però, si passa una copia del puntatore, pertanto sarà sì possibile cambiare il valore della variabile puntata dal puntatore, ma non sarà mai possibile modificare il puntatore riflettendo il cambiamento al di fuori del contesto della funzione senza ricorrere ai puntatori di puntatori. Perciò si può dire definitivamente che non esiste il passaggio per riferimento in C.

    Naturalmente non è esiste nemmeno il passaggio per valore-risultato, caratteristica disponibile solo in alcuni linguaggi tra cui, se non erro, Fortran e Ada. Nel passaggio per valore-risultato le modifiche al parametro formale si riflettono automaticamente sul parametro attuale al termine della funzione.
  • Re: Passaggio per riferimento o pervalore-risultato

    Be', se non altro ci ho messo la buona volontà, dai...
Devi accedere o registrarti per scrivere nel forum
12 risposte