jueves, 30 de noviembre de 2017

C++ Punteros en funciones



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


https://codigogx.blogspot.cl/2017/11/capitulo-89-c-punteros.htmlhttps://codigogx.blogspot.cl/2017/12/c-los-punteros-y-las-cadenas-char.html






C++ El apuntador This

El apuntador This En C++, cada objeto tiene acceso a su propia dirección a través de un puntero o apuntador denominado This. Lo...