2013-07-02 15 views
11

Qualcuno può dirmi la differenza esatta tra chiamata per puntatore e chiamata per riferimento. In realtà cosa sta succedendo in entrambi i casi?Diff tra chiamata per riferimento e chiamata per puntatore

Esempio:

chiamata per riferimento:

void swap(int &x, int &y) 
{ 
    int temp; 
    temp = x; /* save the value at address x */ 
    x = y; /* put y into x */ 
    y = temp; /* put x into y */ 

    return; 
} 

swap(a, b); 

Chiamata per Pointer:

void swap(int *x, int *y) 
{ 
    int temp; 
    temp = *x; /* save the value at address x */ 
    *x = *y; /* put y into x */ 
    *y = temp; /* put x into y */ 

    return; 
} 

    swap(&a, &b); 
+3

In Java non ci sono indicazioni. –

+2

Perché è taggato * java *? – Nawaz

+0

Questa domanda non ha nulla a che fare con Java. –

risposta

13

Entrambi i casi fanno esattamente la stessa cosa.

Tuttavia, la piccola differenza è che i riferimenti non sono mai nulli (e all'interno della funzione si è certi, che fanno riferimento a una variabile valida). D'altra parte, i puntatori potrebbero essere vuoti o potrebbero indicare una posizione non valida nella memoria, causando un AV.

+0

Quale sarebbe il riferimento di 'x' nella seguente chiamata:' swap (* (int *) 0, y) '? –

+0

@ValeriAtamaniouk che sarebbe un comportamento indefinito. – juanchopanza

+0

@ValeriAtamaniouk Ciò che è importante, sarebbe un comportamento indefinito * prima ancora di inserire la funzione *. – Spook

0

Nel tuo esempio, non v'è alcuna differenza.

In C++, il riferimento viene implementato utilizzando i puntatori.

Edit: per chi crede di riferimento non può essere NULL:

int calc(int &arg) 
{ 
    return arg; 
} 

int test(int *arg) 
{ 
    return calc(*arg); 
} 

Guess, quello che sarà il risultato per test(0)?

+3

... eccetto che i puntatori possono essere NULL e i riferimenti non possono ... – trojanfoe

+0

@trojanfoe Il riferimento può puntare su NULL. Anche se non è un caso comune. –

+0

Si prega di mostrare il codice per quello. – trojanfoe

3

Semanticamente queste chiamate hanno risultati identici; sotto il cappuccio i riferimenti sono implementati con i puntatori.

L'importante differenza tra l'utilizzo di riferimenti e puntatori è con i riferimenti che si ha molto meno corda con cui appendere. I riferimenti puntano sempre a "qualcosa", dove i puntatori possono indicare qualsiasi cosa. Ad esempio, è perfettamente possibile fare qualcosa di simile

void swap(int *x, int *y) 
{ 
    int temp; 
    temp = *x; /* save the value at address x */ 
    ++x; 
    *x = *y; /* put y into x */ 
    *y = temp; /* put x into y */ 

    return; 
} 

E ora questo codice potrebbe fare qualsiasi cosa, incidente, correre, avere scimmie volare fuori delle vostre reti di eccellenza, qualsiasi cosa.

In caso di dubbio, preferire riferimenti. Sono un livello più alto e più sicuro di astrazione sui puntatori.

0

Il tuo codice è codice C++. In Java non ci sono indicazioni. Entrambi gli esempi fanno la stessa cosa, dal punto di vista funzionale non c'è differenza.

0

Non so esattamente perché questo è stato taggato come se non ci fossero indicazioni. Tuttavia, per il concetto è possibile utilizzare entrambi i puntatori e il riferimento in modo intercambiabile se si sta lavorando sull'attributo valore. ad esempio i = 4 o * i = 4. Il vantaggio di utilizzare i puntatori è che è possibile manipolare l'indirizzo stesso. A volte è necessario modificare l'indirizzo (puntarlo su qualcos'altro ...) questo è quando i puntatori sono diversi per riferimento; i puntatori consentono di lavorare direttamente sull'indirizzo, il riferimento non sarà

Problemi correlati