C.3.5 Funciones con parametros por referencia.notebook Unidad 2. Funciones 3.7 Parámetros por referencia April 13, 2016 C.3.5 Funciones con parametros por referencia.notebook April 13, 2016 Paso de argumentos por referencia Como ya sea visto, cuando se pasa un argumento por valor, realmente se pasa una copia de éste, y si esta copia se modifica el argumento original no se ve alterado. Sin embargo, en muchas ocasiones se requiere que una función cambie los valores de los argumentos que se le pasan. Para lograrlo se utiliza los punteros. A este proceso se le conoce como paso de argumentos por referencia. En este caso, no se pasa una copia del argumento, sino el argumento mismo (la dirección de la variable). Cuando se realiza un paso de argumentos por referencia en C, lo que se está pasando son direcciones de memoria. Y esta operación se logra mediante la utilización de punteros. De este modo, cuando se declaran y se definen las funciones se ponen punteros como parámetros y en las llamadas se usan direcciones de variables como argumentos. Por ejemplo: #include <stdio.h> void modificar(int *variable); int main() { int i = 1; printf("\ni=%d antes de llamar a la función modificar", i); modificar(&i); printf("\ni=%d después de regresar de la función modificar", i); return 0; } void modificar(int *variable) { printf("\nvariable = %d dentro de modificar", *variable); *variable = 9; printf("\nvariable = %d dentro de modificar", *variable); } Dado que lo que se pasa a la función modificar es la dirección de la variable i a un puntero llamado variable, cuando se cambie el contenido utilizando *variable provocara cambios a la variable i. De ahí, la salida del ejemplo anterior es la siguiente: i = 1 antes de llamar a la función modificar variable = 1 dentro de modificar variable = 9 dentro de modificar i = 9 después de regresar de la función modificar C.3.5 Funciones con parametros por referencia.notebook April 13, 2016 Declaración de funciones con parámetros por referencia Antes de empezar a utilizar una función se debe declarar. Esto es, crear el prototipo de la función. Por ejemplo: void intercambio(int *valor1, int *valor2); En este caso se declara la función intercambio que recibe dos parámetros como punteros ambos apuntando a una dirección donde están almacenados datos del tipo int y el primero tiene como nombre valor1 y el segundo valor2. Cabe señalar que el nombre de los parámetros es opcional y se utiliza para mejorar la comprensión del código fuente. De esta manera, el prototipo de la función intercambio podría expresarse de la siguiente manera: void intercambio(int *, int *); Definición de la función En la definición de la función es indispensable el nombre de los parámetros en el encabezado de la función. De esta manera, la definición de la función intercambio es: void intercambio(int *valor1, int *valor2); { int aux; aux = *valor1; *valor1 = *valor2; *valor2 = aux; } C.3.5 Funciones con parametros por referencia.notebook April 13, 2016 Acceso a la función Cuando se accede a una función con parámetros por referencia, se debe hacer mediante su nombre seguido de la lista de argumentos que utiliza dicha función encerrados entre paréntesis. Los parámetros tendrán que ser enviados a traves de direcciones, en la misma cantidad y tipo. Por ejemplo, una llamada a la función intercambio declarada y definida anteriormente sería la siguiente: int main(void) { int a = 5; int b = 7; printf("Valor de a = %d y de b = %d\n" , a , b); intercambio(&a, &b); printf("Valor de a = %d y de b = %d\n" , a , b); return 0; } C.3.5 Funciones con parametros por referencia.notebook Código Un programa para intermbiar valores quedaría así: #include<stdio.h> void intercambio(int *valor1, int *valor2); //declaración int main(void) { int a = 5; int b = 7; printf("Valor de a = %d y de b = %d\n" , a , b); intercambio(&a, &b); //llamada printf("Valor de a = %d y de b = %d\n" , a , b); return 0; } void intercambio(int *valor1, int *valor2) { int aux; aux = *valor1; *valor1 = *valor2; *valor2 = aux; } //definición April 13, 2016 C.3.5 Funciones con parametros por referencia.notebook April 13, 2016 Realizar Hacer un programa para capturar "n" números, cada numero se captura mediante la función void capturar(int *acumulacion, int *contador) la función permite capturar un numero entero, modificar el acumulador y modificar un contador de números, para que al finalizar la captura por el usuario podamos calcular el promedio de los números introducidos. Hacer un programa que a través de la función void calculos(float base, float altura, float *area, float *perimetro) se pueda calcular el área y perímetro de un rectángulo y que los resultados se muestren en la función principal.