2009-04-04 20 views
5

Hola a todos. Estoy trabajando en un proyecto para la escuela donde necesito pasar algunos parámetros por referencia a través de múltiples funciones. Entiendo cómo me puede pasar por referencia desde donde las variables se declaran a otra función, como este:Pase por referencia a través de funciones múltiples

main() { 
    int x = 0; 
    int y = 0; 
    int z = 0; 

    foo_function(&x, &y, &z); 
} 

int foo_function(int* x, int* y, int* z) { 
    *x = *y * *z; 
    return 0; 
} 

Sin embargo, ¿cómo iba a pasar x, y, z de la función foo a otra función? Algo como esto me da todo tipo de advertencias de compilador.

int foo_function(int* x, int* y, int* z) { 
    *x = *y * *z; 
    bar(&x, &y, &z); 
    return 0; 
} 

int bar(int* x, int* y, int* z) { 
    //some stuff 
} 
+0

Gaaakkk ... abra la llave en la misma línea que el código ... –

+1

Como Dios mismo lo intentó. – jergason

Respuesta

11

sólo tiene que utilizar:

bar(x, y, z); 

X, Y, y Z ya son punteros - sólo tiene que pasar con ellos directamente.

Recuerde: un puntero es una ubicación en la memoria. La ubicación no cambia Cuando desreferencia el puntero (usando * x = ...), está configurando el valor en esa ubicación. Pero cuando lo transfieres a una función, estás pasando la ubicación en la memoria. Puedes pasar esa misma ubicación a otra función y funciona bien.

2

No necesita hacer nada, ya son referencias.

int foo_function(int* x, int* y, int* z) { 
    bar(x, y, z); 
    return 0; 
} 

int bar(int* x, int* y, int* z) { 
    //some stuff 
} 
2

En foo_function x y y z son ya punteros (int *), por lo que puede hacer la barra (x, y, z).

2
int foo_function(int* x, int* y, int* z) { 
    *x = *y * *z; 
    /* x, y and z are pointers to int 
     &x, &y and &z are pointers to pointer to int 
     bar expects pointers to int, so call bar as: 
    */ 
    bar(x, y, z); 
    return 0; 
} 
2

C no tiene la noción de pasar por referencia. Los parámetros siempre pasan por valor. Sin embargo, al usar punteros, este valor es en realidad un puntero a su valor real.

Pero lo que está haciendo con

foo_function(&x, &y, &z); 

que realmente está tratando de obtener una dirección del puntero, que es esencialmente de significado (que pasaría un int** en lugar de un int*).

Así,

foo_function(x, y, z); 

sería la llamada correcta, como x, y y z ya son punteros y que no es necesario para hacer la cadena apunta por más tiempo :)

Cuestiones relacionadas