Buscar..


Introducción

El alcance de esta sección es explicar las diferencias en la teoría y la implementación de lo que sucede con los parámetros de una función al llamar.

En detalle, los parámetros se pueden ver como variables antes de la llamada a la función y dentro de la función, donde el comportamiento visible y la accesibilidad a estas variables difiere con el método utilizado para entregarlas.

Además, este tema también explica la reutilización de las variables y sus valores respectivos después de la llamada a la función.

Llamar por valor

Al llamar a una función hay nuevos elementos creados en la pila de programas. Estos incluyen alguna información sobre la función y también el espacio (ubicaciones de memoria) para los parámetros y el valor de retorno.

Cuando se entrega un parámetro a una función, el valor de la variable utilizada (o literal) se copia en la ubicación de memoria del parámetro de la función. Esto implica que ahora hay dos ubicaciones de memoria con el mismo valor. Dentro de la función solo trabajamos en la ubicación de memoria de parámetros.

Después de abandonar la función, la memoria en la pila de programas se abre (elimina), lo que borra todos los datos de la llamada a la función, incluida la ubicación de la memoria de los parámetros que utilizamos en el interior. Por lo tanto, los valores cambiados dentro de la función no afectan los valores de las variables externas.

int func(int f, int b) { 
  //new variables are created and values from the outside copied
  //f has a value of 0
  //inner_b has a value of 1
  f = 1;
  //f has a value of 1
  b = 2;
  //inner_b has a value of 2
  return f+b;
}

int main(void) {
  int a = 0;
  int b = 1; //outer_b
  int c;

  c = func(a,b);
  //the return value is copied to c
  
  //a has a value of 0
  //outer_b has a value of 1   <--- outer_b and inner_b are different variables
  //c has a value of 3
}

En este código creamos variables dentro de la función principal. Estos obtienen valores asignados. Al llamar a las funciones, se crean dos nuevas variables: f e inner_b donde b comparte el nombre con la variable externa y no comparte la ubicación de la memoria. El comportamiento de a<->f y b<->b es idéntico.

El siguiente gráfico simboliza lo que está sucediendo en la pila y por qué no hay cambios en varibale b . El gráfico no es completamente exacto pero enfatiza el ejemplo. Visualización de la pila durante la llamada a la función.

Se llama "llamada por valor" porque no entregamos las variables, sino solo los valores de estas variables.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow