2010-11-15 21 views
11

Si tengo una función que toma int *&, ¿qué significa? ¿Cómo puedo pasar solo un int o un puntero int a esa función?¿Qué significa * & en un parámetro de función

function(int *& mynumber); 

Siempre que trato de pasar un puntero a esa función que dice:

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

Ese error es debido a exactamente lo que estaba hablando con "debe ser un valor l, no solo un valor r". La regla en cuestión es "no se puede vincular una referencia temporal con una referencia no constante", el resultado del operador & "dirección de" es temporal. – Flexo

Respuesta

20

Es una referencia a un puntero a un int. Esto significa que la función en cuestión puede modificar tanto el puntero como la propia int.

Puede simplemente pasa un puntero de, la complicación es que el puntero tiene que ser un l-valor, no sólo un valor r, así que por ejemplo

int myint; 
function(&myint); 

por sí sola no es suficiente y tampoco se permitiría 0/NULL, Donde como:

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

sería aceptable. Cuando la función retorna, es bastante posible que myintptr ya no apunte a lo que estaba señalando inicialmente.

int *myintptr = NULL; 
function(myintptr); 

también podría tener sentido si la función estaba esperando para asignar la memoria cuando se les da un puntero NULL. Consulte la documentación provista con la función (¡o lea la fuente!) Para ver cómo se espera que se use el puntero.

10

Simplemente: una referencia a un puntero.

En C, sin referencias, la forma tradicional de "trasladar" un puntero, es pasar un puntero a un puntero:

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

En C++, esto se puede expresar por la sintaxis de referencia, para evitar la doble desreferencia incómoda.

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

+1 Me gusta cómo lo explicaste en C++ * y * C. – Audrius

7

Significa una referencia a un puntero a un int. En otras palabras, la función puede cambiar el parámetro para apuntar a otra cosa.

Para pasar una variable, solo pase un int *. Como señala awoodland, lo que se transfiere debe ser un l-value.

Editar:

Para aprovechar el ejemplo de 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, buena referencia para l-value, no pude encontrar nada que valiera la pena vincular. – Flexo

+0

@awoodland, gracias. Admito que este fue el primer hit de google para mí. Estaba buscando algo más definitivo, pero no encontré una referencia mejor. – luke

+0

Si lo entiendo bien, si tengo una función que devuelve un puntero, ¿debo asignarlo a otro puntero antes de pasarlo a la función? – DogDog

0

Esta es una referencia a un puntero a int - que tendría que pasar en la dirección de un int a esta función, y tenga en cuenta que la función podría cambiar el puntero a través de la referencia.

ejemplo 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 toma un solo parámetro, mynumber que es una referencia a un puntero a un int.

Esto es útil cuando necesita pasar un puntero a una función, y esa función puede cambiar el puntero. Por ejemplo, si usted función se implementa como esto:

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

... Entonces algo como esto podría suceder en el código de llamada:

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