0

Tengo básicamente un código tal que así:

    int valor = 50;
    int resultado;

    void main(void)
    {
        resultado = operacion(valor);
    }

Cuando lo ejecuto, resultado no me da el valor que busco, luego depurando me doy cuenta que si paso un parámetro ya sea por valor o por referencia, dentro de la función, la dirección del parámetro no es la misma que la dirección de la variable global valor.

Pongo unas imágenes para que se entienda gráficamente

En la foto siguiente, estoy en la línea antes de aplicar la función y se aprecia la dirección de la variable introducir la descripción de la imagen aquí

En el siguiente step, me meto en la función

introducir la descripción de la imagen aquí

No entiendo por qué pasa eso. Y da igual si el paso es por valor o referencia. ¿sugerencias?

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • 1
    En C, los parámetros de las funciones siempre se pasan por valor. Siempre hace una copia de la variable con su contenido. Cuando pasas un puntero, se crea otra variable puntero diferente, pero con el mismo contenido, así que apunta al mismo sitio que el puntero con el que llamas a la función. – SuperG280 Jun 05 '20 at 08:33
  • adicionalmente a lo que te han comentado, el tipo `int`, no tiene decimales, luego (50/100)*2, en vez de 1, dará como resultado 0, puesto que 50/100 resulta 0. Tiene toda la pinta que eso es lo que provoca los resultados incorrectos. Tienes que cambiar, dentro de la función, a `float` o `double` para hacer las operaciones y, finalmente, convertir el resultado a `int` – eferion Jun 05 '20 at 13:26

2 Answers2

1

Aclararemos dos conceptos:

  1. En no existe el paso por referencia.
  2. Las variables locales ensombrecen las variables globales.

Por lo tanto, voy a marcar los diferentes ámbitos de tu código:

/* Ámbito GLOBAL      */ int valor = 50;
/* Ámbito GLOBAL      */ int resultado;
/* Ámbito GLOBAL      */
/* Ámbito GLOBAL      */ int operacion(int valor)
/* Ámbito 'operacion' */ {
/* Ámbito 'operacion' */     return valor + valor;
/* Ámbito 'operacion' */ }
/* Ámbito GLOBAL      */ 
/* Ámbito GLOBAL      */ void main(void)
/* Ámbito 'main'      */ {
/* Ámbito 'main'      */     return resultado = operacion(valor);
/* Ámbito 'main'      */ }

Cuando en el ámbito de main pasas a la función operacion la variable valor, estás pasando la variable valor que pertenece al ámbito global.

Dentro del ámbito de operacion la variable valor no es la del ámbito global si no la del ámbito de operacion, por lo que la dirección de [GLOBAL]valor será diferente a la dirección de [operacion]valor.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
0

:O

con respecto al punto 1. si mi código le pongo los * y los &, por ejemplo:

operacion(&valor)

le estoy pasando la dirección y haciéndolo por referencia, ¿no?

al punto 2. entendido. Gracias =)

  • El espacio de respuestas no es para hacer preguntas. No confundas [tag:c++] con [tag:c], son lenguajes distintos. – PaperBirdMaster Jun 05 '20 at 13:41
  • Además, estás confundiendo pasar un puntero por copia con pasar una variable por referencia. [Lee este hilo](https://es.stackoverflow.com/questions/46909/cual-es-la-diferencia-entre-int-e-int/46931#46931) para saber la diferencia entre puntero y referencia y [este hilo](https://es.stackoverflow.com/questions/353484/cómo-funcionan-los-punteros-por-referencia-pasados-como-parámetro-de-funciones/353628#353628) respecto a la inexistencia de referencias en [tag:c]. – PaperBirdMaster Jun 05 '20 at 13:48