Ahora hablara sobre un tema basico en la la programacion en lenguaje C y es el paso de parametros a funciones por valor y por referencia.

Cuando se empieza a aprender el lenguaje C y se habla sobre el tema de las funciones generalmente no se habla sobre este tema pues podria confundir a la persona que esta aprendiendo, el solo hecho de aprender el concepto de funcion y su manejor pede costar algo de tiempo y lo digo porque lo mismo me sucedio a mi cuando recien empezaba.

veamos un ejemplo de uso comun de una funcion

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void porValor(int param){
     param +=2;
}
 
int main(){
    int numero=5;
    porValor(numero);
    printf("El valor de numero es %d", numero);
    return 0;
}

La salida del programa anterior debe ser:


El valor de numero es 5

En las lineas anteriores de codigo se ha pasado por valor la

variable numero a la funcion porValor(), ¿que significa esto? que cuando paso la variable numero a la funcion porValor() el sistema crea un copia de la variable numero y la funcion porValor() trabajara exclusivamente sobre la copia de la variable numero y NO sobre la variable numero declarada al inicio del codigo. La variable numero y la copia de esta variable se localizan en lugares distintos en la memoria de la computadora y por lo tanto sus valores son independientes entre si.

Es por eso que al modificar la copia de la variable numero dentro de la funcion porValor no afecta en ningun sentido a la verdadera variable numero.

Tal vez te preguntaras ¿y que tal si yo quiero modificar la original variable numero dentro de la funcion porValor()?

La respuesta es muy sencilla solo hay que hacer uso del paso de valores por referencia.

El paso de valores por referencia consiste en pasar a la una funcion la direccion real de memoria de una variable, de esta forma cuando se modifica la variable dentro de una funcion se estara modificando directamente la variable que ha sido pasada por parametro, sin hacer uso de ninguna copia de dicha variable.

veamos el codigo correspondiente:

1
2
3
4
5
6
7
8
9
10
void porRef( int *param ){
      *param +=2;
}
 
int main(){
    int numero = 5;
    porRef(&numero);
    printf("El valor de numero es %d", numero);
    return 0;
}

Ahora si la salida del codigo anterior debe ser la siguiente:


El valor de numero es 7

Analizemos el codigo anterior. ¿Cuales fueron las modificaciones que hizimos con respecto al codigo anterior? pues… a la funcion porRef necesitamos pasarle la direccion de la variable que queremos modificar por eso en la linea 7 usamos el operador direccion & para obetner la direccion de numero y pasarla a porRef(),en la linea 1 observa como en la definicion de la funcion porRef() dentro de los parametros porRef(int *param) estamos recibiendo un puntero a entero, lo necesitamos porque hemos enviado a la funcion la direccion de una variable y sabemos que los punteros almacenan la direccion de una variable.

Dentro del codigo de la funcion (linea 2) seguimos usando el operador * para afectar directamente el contenido de la variable numero, lo unico que hacemos es aumentarlo en 2 unidades.

Esta es la forma mas sencilla en la que se ha ocurrido hablar sobre este tema, pero si aun te cuesta entender esto no te preocupes, lo unico que recomiendo es escribir pequeños trozos de codigo para hacer pruebas y tu mismo te daras cuenta al menos a nivel intuitivo sobre que es lo que esta pasando.

Leave a Reply