2010-11-15 15 views
11

Se ho una funzione che richiede int *&, cosa significa? Come posso passare solo un int o un puntatore int a quella funzione?Cosa significa * e significato in un parametro di funzione

function(int *& mynumber); 

Ogni volta che provo a passare un puntatore a funzione che si dice:

error: no matching function for call to 'function(int *)' 
note: candidate is 'function(int *&)' 
+3

Tale errore è a causa della esattamente quello che stavo parlando con "deve essere un valore di l, non solo un valore di r". La regola in questione è "non è possibile associare un riferimento temporaneo a un riferimento non const", il risultato dell'operatore & "address of" è temporaneo. – Flexo

risposta

20

È un riferimento a un puntatore a un int. Ciò significa che la funzione in questione può modificare sia il puntatore che l'int stesso.

Si può solo passa un puntatore, quella complicazione è che il puntatore deve essere un l-value, non solo un valore di R, così per esempio

int myint; 
function(&myint); 
sola

non è sufficiente e né lo 0/NULL è ammissibile, dove:

int myint; 
int *myintptr = &myint; 
function(myintptr); 

sarebbe accettabile. Quando la funzione ritorna, è del tutto possibile che myintptr non punti più a ciò a cui inizialmente puntava.

int *myintptr = NULL; 
function(myintptr); 

potrebbe anche avere senso se la funzione era in attesa di allocare la memoria quando viene fornito un puntatore NULL. Controlla la documentazione fornita con la funzione (o leggi la fonte!) Per vedere come il puntatore dovrebbe essere usato.

10

Semplicemente: un riferimento a un puntatore.

In C, senza riferimenti, il modo tradizionale di "spostare" un puntatore, è passare un puntatore a un puntatore:

void c_find(int** p, int val); /* *p will point to the node with value 'val' */ 

In C++, questo può essere espressa mediante la sintassi di riferimento, per evitare l'imbarazzante doppia dereferenza.

void cpp_find(int*& p, int val); // p will point to the node with value 'val' 
+3

+1 Mi piace come l'hai spiegato in C++ * e * C. – Audrius

7

Significa un riferimento a un puntatore a un int. In altre parole, la funzione può cambiare il parametro in modo che punti a qualcos'altro.

Per passare una variabile in, basta passare un * int. Come sottolineato da awoodland, ciò che è passato deve essere un l-value.

Edit:

Per costruire l'esempio di awoodland:

#include <iostream> 

void foo(int*& var) 
{ 
    delete var; 
    var = new int; 
} 

int main(int argc, char* argv[]) 
{ 
    int* var = NULL; 

    std::cout << var << std::endl; 

    foo(var); // this function can/will change the value of the pointer 

    std::cout << var << std::endl; 

    delete var; 

    return 0; 
} 
+0

+1, buon riferimento per il valore l, non ho trovato nulla che valesse la pena di essere collegato. – Flexo

+0

@awoodland, grazie. Ammetto che questo è stato il primo hit di Google per me. Stavo cercando qualcosa di più definitivo, ma non ho trovato un riferimento migliore. – luke

+0

Se ho capito bene, se ho una funzione che restituisce un puntatore, devo assegnarlo a un altro puntatore prima di passarlo alla funzione? – DogDog

0

Questo è un riferimento a un puntatore a int - che avrebbe dovuto passare l'indirizzo di un int a questa funzione, e sii consapevole che la funzione potrebbe cambiare il puntatore attraverso il riferimento.

esempio Dumb:

void func(int*& iref) 
{ 
    iref = new int; 
} 

int main() 
{ 
    int i(0); 
    int* pi(&i); 

    func(pi); 
    // pi no longer equal to &i 

    return 0; 
} 
2

function accetta un singolo parametro, mynumber che è un riferimento a un puntatore a un int.

Questo è utile quando è necessario passare un puntatore a una funzione e tale funzione potrebbe cambiare il puntatore. Ad esempio, se si funzione è implementata in questo modo:

function(int*& mynumber) 
{ 
    if(!mynumber) 
    mynumber = new int; 
    *mynumber = 42; 
} 

... Poi qualcosa di simile potrebbe accadere nel codice chiamante:

int main() 
{ 
    int* mynumber = 0; 
    function(mynumber); // function will change what "mynumber" points to 
    cout << *mynumber; 
    return 0; 
} 
Problemi correlati