Download CONTENIDO DE LA LECCIÓN 12
Document related concepts
no text concepts found
Transcript
MIGUEL Á. TOLEDO MARTÍNEZ CONTENIDO DE LA LECCIÓN 12 CAMBIO DE VALORES A LOS ARGUMENTOS 1. Introducción 2 2. 2 El porque las funciones normalmente no pueden cambiar los valores de un argumento 2.1. Ejemplo 12.1 3. Cambio de valores de los argumentos 3.1. Ejemplos 12.2, 12.3 4. Lo que necesita saber FUNCIONES – LECCIÓN 12 2 3 4 5 12-1 MIGUEL Á. TOLEDO MARTÍNEZ LECCIÓN 12 CAMBIO DE VALORES A LOS ARGUMENTOS INTRODUCCIÓN En esta lección aprenderá como cambiar los valores de los argumentos dentro de una función. Objetivos de esta lección: • Comprender el porqué las funciones C++ normalmente no pueden cambiar los valores de los argumentos. • Utilizar el operador de dirección ampersand (&) de C++. • Utilizará el operador indirección de la memoria (apuntador) asterisco (*) • Cambiar los valores de un argumento dentro de una función. EL PORQUE LAS FUNCIONES NORMALMENTE NO PUEDEN CAMBIAR LOS VALORES DE UN ARGUMENTO Ejemplo 12.1 El siguiente programa: SINCAM.CPP, pasa dos argumentos llamados grande y pequeno, a la función despliegaValores(). La función despliegaValores(), asigna el valor 1001 a ambos parámetros. Cuando la función termina, el programa principal despliega los valores de los argumentos. /* El siguiente programa: SINCAM.CPP, ilustra el uso de paso de argumentos por valor */ #include <iostream.h> //Para cout void despliegaValores(int a, int b) { a = 1001; b = 1001; cout << "Los valores dentro de la función despliegaValores son " y " << b << endl << endl; : " << a << } void main(void) { int grande = 2002, pequeno = 0; cout << "Los valores de grande y pequeño antes de llamar a la función son : " << grande << " y " << pequeno << endl << endl; despliegaValores(grande, pequeno); cout << "Los valores de grande y pequeño después de llamar a la función son: " << grande << " y " << pequeno << endl; }//Fin de main() Cuando sus programas pasan argumentos a una función, por omisión, C++ realiza una copia de los valores de los argumentos y coloca la copia en una ubicación de memoria temporal llamada pila. La función utiliza los valores de la copia. Cuando la función termina, C++ descarta el contenido de la pila y cualquier cambio que la función halla hecho a la copia. FUNCIONES – LECCIÓN 12 12-2 MIGUEL Á. TOLEDO MARTÍNEZ Como sabe, una variable es un nombre que su programa asigna a una ubicación de la memoria, en la cual se almacena un valor. Supongamos, por ejemplo, que las variables grande y pequeno residen en las direcciones de la memoria 10 y 12. Cuando pasa las variables a la función despliegaValores() colocará una copia de los valores de la variable en la pila. Como lo muestra la figura 12.1, la función despliegaValores() utilizará las copias de los valores de las variables. Direcciones 10 2002 12 0 grande 2002a a 0 b pequeno Memoria despliegaValores(grande, pequeno) Pila void despliegaValores(int a, int b) { // enunciados } Figura 12.1. Paso de los argumentos por valor Ya que la función despliegaValores() no tiene conocimiento de la ubicación de grande y pequeno (dir 10 y dir 12), la función no puede cambiar los valores de las variables. CAMBIO DE VALORES DE LOS ARGUMENTOS Para cambiar el valor de un argumento, la función debe saber la dirección en la memoria de dicho argumento. Para decirle a la función que un argumento es una dirección, su programa debe utilizar el operador de dirección ampersand (&) de C++. La siguiente función ilustra como su programa pasa las direcciones de las variables grande y pequeno a la función despliegaValores(): despliegaValores(&grande, &pequeño); Dentro de la función, debe indicarle a C++ que el programa pasará argumentos con direcciones. Para hacer esto, declara las variable con apuntadores, precediendo a cada nombre de variable con un asterisco, como se muestra a continuación: void despliegaValores(int *a, int *b); Cuando asigne valores dentro de la función, debe indicarle a C++ que la función está trabajando con parámetros con dirección. Para hacer esto, preceda el nombre del parámetro con un asterisco, como se muestra a continuación: *a = 1001; *b = 1001; FUNCIONES – LECCIÓN 12 12-3 MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo 12.2 El siguiente programa, CAMPAR.CPP utiliza el operador de dirección para pasar las direcciones de los argumentos grande y pequeno a la función cambiaValores. La función trabaja con los apuntadores a las direcciones de memoria de los argumentos. Por lo tanto, los cambios que la función realiza con los parámetros se sostiene después de que la función termina de ejecutarse: /* El siguiente programa: CAMPAR.CPP, ilustra el uso de paso de los argumentos por referencia */ #include <iostream.h> //Para cout y cin void cambiaValores(int *a, int *b) { *a = 1001; *b = 1001; cout << "Los valores dentro de la función cambiaValores son << *a << " y " << *b << endl << endl; }//Fin de cambiaValores() :" void main(void) { int grande =2002, pequeno = 0; cout << "Los valores de grande y pequeño antes de la función son << grande << " y " << pequeno << endl << endl; :" cambiaValores(&grande, &pequeno); cout << "Los valores de grande y pequeño después de ejecutar la función son: " << grande << " y " << pequeno << endl; }//Fin de main() Como puede ver, los valores que la función cambiaValores() asigna a los parámetros tienen efecto aun después de que la función termina. Para comprender el por qué los cambios que la función realiza a las variables permanecen, requiere recordar que la función tiene acceso a las direcciones de las variables. Cuando pasa los argumentos mediante dirección, C++ coloca la dirección de cada variable en la pila como se muestra a continuación: Direcciones 10 2002 10 b 0 12 a 12 memoria pila cambiaValores(&grande, &pequeno) void cambiaValores(int *a, int *b) Figura 12.2. Paso de los argumentos por referencia FUNCIONES – LECCIÓN 12 12-4 MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo 12.3 El siguiente programa, INTCAVAL.CPP, pasa las direcciones de dos argumentos de clase flotante a la función intercambiaValores(). La función utiliza apuntadores a la dirección de cada argumento para intercambiar sus valores: /* El siguiente programa: INTCAVAL.CPP, intercambia los valores de dos argumentos pasados por referencia. */ #include <iostream.h> //Para cout y cin void intercambiaValores(float *a, float *b) { float temp; temp = *a; *a = *b; *b = temp; }//Fin de intercambiaValores() void main(void) { float grande float pequeno = 10000.0; = 0.00001; cout << "Antes de llamar a la función: " << endl; cout << "Grande contiene : " << grande << endl; cout << "Pequeño contiene: " << pequeno << endl << endl; intercambiaValores(&grande, &pequeno); cout << "Despues de llamar a la función: " << endl; cout << "Grande contiene : " << grande << endl; cout << "Pequeño contiene: " << pequeno << endl; }//Fin de main() LO QUE NECESITA SABER Antes de continuar con la siguiente lección, asegúrese de haber comprendido los siguientes conceptos: !"Normalmente, una función no puede cambiar los valores de los argumentos. !"Cuando su programa pasa argumentos a la función, C++ coloca una copia de los valores de los argumentos en un almacenamiento temporal llamado pila; cualquier cambio que la función realice a los parámetros afecta únicamente a la copia de los valores que residen en la pila. !"Para cambiar un valor de un argumento, la función debe tener conocimiento de la dirección del argumento. !"Utilizando el operador de dirección ampersand (&) de C++, su programa puede pasar una dirección de una variable a la función. !"Cuando una función recibe la dirección de una variable, la función debe declarar las variables como apuntadores (precediendo el nombre de la variable con un asterisco). !"Cuando la función quiere utilizar el valor apuntado por el apuntador, la función debe preceder al nombre de la variable con apuntador con un asterisco. FUNCIONES – LECCIÓN 12 12-5