PUNTEROS EN
FUNCIONES, PASO POR REFERENCIA
También es
posible modificar el valor de una variable mediante el uso de una función. Para
ello, lo que debemos de hacer es pasar a la función un parámetro por
referencia. Esto significa que el parámetro de la función, debe ser un puntero.
De no ser por el uso de los punteros, la variable solamente cambiaría su valor
mientras la función esté activa, pero una vez fuera de la función, los datos
son destruidos y la variable volverá a tomar su valor inicial. Al usar
punteros, se realizan cambios permanentes ya que se trabaja con la dirección de
memoria.
Ejemplo de una función que eleva al cuadrado el valor de la
variable:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
//prototipo
void potencia(int *);
int main(){
int numero;
cout << "Ingresa un
numero: ";
cin >> numero;
cout << "El valor de
la variable es: " << numero << endl;
//se llama a la función, entregando la
dirección de la variable
potencia(&numero);
cout << "El nuevo
valor de la variable es: " << numero << endl;
return 0;
}
//funcion
void potencia(int *pot){
*pot = *pot * *pot;
}
Al ejecutar este programa, este es el resultado.
El prototipo de la función indica que su parámetro es
un puntero, por eso se agregó el signo *. No es necesario en los prototipos
especificar un nombre para el parámetro ya que el compilador lo ignorará, solo
es suficiente indicar el tipo, que en
este caso es int.
void potencia(int *);
Lo primero que hace el programa es solicitar un
número, cuyo valor es guardado en una variable, luego muestra por pantalla el
valor que asume la variable.
int numero;
cout << "Ingresa un
numero: ";
cin >> numero;
cout << "El valor de
la variable es: " << numero << endl;
Posteriormente, llama a la función, entregando como
parámetro la dirección de memoria de la variable, esto fue hecho utilizando el
signo &
potencia(&numero);
Por último, vuelve a mostrar el valor de la variable, el cual se ve
modificado
cout << "El nuevo valor de la variable es: " <<
numero << endl;
Más abajo se puede ver la función, la cual recibe
como argumento un puntero.
void potencia(int
*pot){
Como la función envió la dirección de memoria de la variable numero
(&numero), el parámetro debe usar el signo de indirección (*)para poder trabajar con esa
información (la indirección se refiere en esta oportunidad, al número ingresado
por el usuario) y en este caso, realizar una multiplicación.
Lo que hace a continuación esta función, es modificar
el valor que ha recibido, y para ello, utiliza los punteros.
*pot = *pot *
*pot;
Si este programa se hubiese hecho exactamente igual
pero sin usar punteros, el valor de la variable no hubiese cambiado. A
continuación, un ejemplo de esto
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
//prototipo
void potencia(int);
int main(){
int numero;
cout << "Ingresa un
numero: ";
cin >> numero;
cout << "El valor de
la variable es: " << numero << endl;
potencia(numero);
cout << "El nuevo
valor de la variable es: " << numero << endl;
return 0;
}
//funcion
void potencia(int
pot){
pot = pot * pot;
}
Al ejecutar el programa, este es su resultado
Como se puede ver, la variable no fue modificada, en
realidad, solo se modificó su valor al llamar la función (donde se hizo la
operación), ya que su argumento es una copia de la variable, pero cuando la
función terminó, los valores que mantenía la función, fueron destruidos.
En el ejemplo mostrado en un principio, se utilizó
una función que no retorna ningún valor (void), pero también se puede hacer una
función que retorne un valor (return), el código es casi el mismo y es el que
sigue a continuación.
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
//prototipo
int potencia(int *);
int main(){
int numero;
cout << "Ingresa un numero:
";
cin >> numero;
cout << "El valor de la variable
es: " << numero << endl;
potencia(&numero);
cout << "El nuevo valor de la
variable es: " << numero << endl;
return 0;
}
//funcion
int potencia(int *pot){
*pot = *pot * *pot;
return *pot;
}
Como se puede apreciar, el código es casi el mismo,
excepto que esta vez puede retornar un valor.
Como consejo, es preferible usar el paso por valor
para pasar argumentos a una función, a menos que se requiera explícitamente que
el valor de una variable sea modificado. El tener esto presente puede evitar
posible errores al momento de modificar una variable que no se debía.
Esto es todo por ahora. Saludos
Gustavo J. Cerda Nilo
Noviembre 2017