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