Como hacer para pasar un puntero por referencia en C

publicado por: Anonymous

Pues lo dicho en C++ me compila este código sin problemas:

    void pasoPorReferencia(int *&referencia){

      cout<<referencia<<endl;

      int *dir_cambio, m = 2;
      dir_cambio = &m;

      cout<<dir_cambio<<endl;

      referencia = dir_cambio;

      cout<<referencia<<endl;

    }

    int main(int argc, char const *argv[]) {

      int *dir_entero, n = 13;

      dir_entero = &n;

      cout<<dir_entero;
      pasoPorReferencia(dir_entero)<<endl;

      cout<<dir_entero<<endl;

      return 0;
    }

Y en C:

    void pasoPorReferencia(int *&referencia){

      printf(" %p n",referencia);

      int *dir_cambio, m = 2;
      dir_cambio = &m;

      printf(" %pn",dir_cambio);

      referencia = dir_cambio;

      printf(" %p",referencia);
    }

Me lanza los siguientes errores:

    PruebaPunterosPorReferenciaC.c:6:29: error: expected ')'
    void pasoPorReferencia(int *&referencia){
                        ^
    PruebaPunterosPorReferenciaC.c:6:23: note: to match this '('
    void pasoPorReferencia(int *&referencia){
                  ^
    PruebaPunterosPorReferenciaC.c:6:29: error: parameter name omitted
    void pasoPorReferencia(int *&referencia){

¿Por que en C no compila dicha sintaxis?¿Como adaptarlo a C?

solución

Primero de todo, C estándar simplemente no permite el paso por referencia, todo es pasado por valor. Cuando se pasa una variable como argumento a una función, lo que se pasa es su valor y ese valor es copiado localmente dentro de la función. No obstante, podemos emular el paso por referencia usando punteros.

Para conseguir el mismo resultado solo necesitas pasar un puntero que apunte al puntero que quieres pasar por referencia. Sigues pasando por valor en todo momento, lo que haces es pasar el valor de un puntero que apunta al puntero dir_entero, es decir, pasamos en realidad a la función la dirección de memoria donde se localiza dir_entero. Esta variable es copiada en pasoPorReferencia localmente y usada para modificar la dirección de memoria a la que apunta el propio puntero pasoPorReferencia usando el operador de desreferencia (*).

#include <stdio.h>

void pasoPorReferencia(int **referencia)
{
    int *dir_cambio, m = 2;
    dir_cambio = &m;
    *referencia = dir_cambio;
}

int main(int argc, char const *argv[])
{
    int *dir_entero, n = 13;

    dir_entero = &n;

    printf("Valor al que apunta dir_entero: %in", *dir_entero);
    pasoPorReferencia(&dir_entero);
    printf("Valor al que apunta dir_entero tras llamar a pasoPorreferencia: %in", *dir_entero);

    return 0;
}

Ver en compilador online: https://repl.it/LL2F/1

No hay que dejarse confundir con lo de usar un puntero a puntero, el mecanismo es el mismo que cuando pretendemos emular el paso por referenciad de un int o un double, por ejemplo.

#include <stdio.h>
#include <math.h>


void elevar_al_cubo(double *n)
{
    *n = pow(*n, 3);
}

int main(int argc, char const *argv[])
{
    double n = 5;
    printf("%0.f elevado a 3 es ", n);
    elevar_al_cubo(&n);
    printf("%0.f.n", n);
    return 0;
}

Hay que recordar que aunque C++ herede muchos conceptos de C y sea en gran medida compatible con él, son dos lenguajes diferentes. Entre sus muchas diferencias está que C++ si permite el paso por referencia real de una variable a una función o método.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *