Tutorial de C++ - Punteros

9 - Punteros

[editar]
Tutorial creado por Peter Class; traducción por Pello Xabier Altadill Izura. Extraido de: http://es.tldp.org/Manuales-LuCAS/doc-tutorial-c++/html/
28 de Febrero de 2006

Acaso creiais que en c++ no habia punteros? eso solo ocurre en Java. Los punteros no contienen datos, contienen direcciones de memoria. Para cada tipo de dato hay que definir un puntero.

/**
  * Puntero.cpp
  * 
  * Clase que muestra las direcciones de variables
  * Pello Xabier Altadill Izura
  * Compilar: g++ Puntero.cpp -o Puntero
  */
  
  using namespace std;
  #include <iostream>
  
  int main () {
  
   // Creamos varias variables:
   int pruebaInt = 99, prueba2Int;
  
   short pruebaShort = 34;
   char carac = 'a';
   int *puntero = 0;
   int *punteroNuevo;
  
   // Ahora las mostramos por pantalla:
   cout << "Variable pruebaInt: " << pruebaInt << endl;
   cout << "Direccion pruebaInt: " << &pruebaInt << endl << endl;
   
   cout << "Variable prueba2Int: " << prueba2Int << endl;
   cout << "Direccion prueba2Int: " << &prueba2Int << endl << endl;
   
   cout << "Variable pruebaShort: " << pruebaShort << endl;
   cout << "Direccion pruebaShort: " << &pruebaShort << endl << endl;
  
   cout << "Variable carac: " << carac << endl;
   cout << "Direccion carac: " << &carac << endl << endl;
   
   cout << "Variable puntero: " << puntero << endl;
   
   // ATENCION, si el puntero no tiene valor dara
   // SEGMENTATION FAULT y la CAGAREMOS de gordo
   //cout << "Variable puntero: " << *puntero << endl;
   
   cout << "Direccion puntero: " << &puntero << endl << endl;
  
   puntero = &pruebaInt;
   cout << "Variable puntero: " << puntero << endl;
   cout << "Variable puntero: " << *puntero << endl;
   cout << "Direccion puntero: " << &puntero << endl << endl;
  
   return 0;
  
  }

Veamos otro ejemplo...

/**
  * Puntero2.cpp
  * 
  * Clase que muestra mas usos de los punteros
  * Pello Xabier Altadill Izura
  * Compilar: g++ Puntero2.cpp -o Puntero2
  */
  
  using namespace std;
  #include <iostream>
  
  // prototipo de funciones que implementamos luego
  int devuelve(int *punteroInt, int entero);
  
  
  int main () {
  
   // Creamos varias variables:
   int pruebaInt = 99, prueba2Int;
   short pruebaShort = 34;
   char carac = 'a';
   int *puntero = 0;
   int *punteroNuevo;
   
   // Ahora las mostramos por pantalla:
   cout << "Variable pruebaInt: " << pruebaInt << endl;
   cout << "Direccion pruebaInt: " << &pruebaInt << endl << endl;
   
   cout << "Variable prueba2Int: " << prueba2Int << endl;
   cout << "Direccion prueba2Int: " << &prueba2Int << endl << endl;
  
   cout << "Variable pruebaShort: " << pruebaShort << endl;
   cout << "Direccion pruebaShort: " << &pruebaShort << endl << endl;
  
   cout << "Variable carac: " << carac << endl;
   cout << "Direccion carac: " << &carac << endl << endl;
  
   cout << "Variable puntero: " << puntero << endl;
  
   // ATENCION, si el puntero no tiene valor dara
   // SEGMENTATION FAULT y la CAGAREMOS
   //cout << "Variable puntero: " << *puntero << endl;
   cout << "Direccion puntero: " << &puntero << endl << endl;
   puntero = &pruebaInt;
   cout << "Variable puntero: " << puntero << endl;
   cout << "Variable puntero: " << *puntero << endl;
   cout << "Direccion puntero: " << &puntero << endl << endl;
   
   *puntero = 345;
  
   cout << "Variable puntero: " << puntero << endl;
   cout << "Variable puntero: " << *puntero << endl;
   cout << "Direccion puntero: " << &puntero << endl << endl;
   
   // Ahora las mostramos por pantalla:
   cout << "Variable pruebaInt: " << pruebaInt << endl;
   cout << "Direccion pruebaInt: " << &pruebaInt << endl << endl;
  
   *punteroNuevo = devuelve(puntero,34);
   
   cout << " Tras llamada: " << endl;
   cout << "Variable puntero: " << punteroNuevo << endl;
   cout << "Variable puntero: " << *punteroNuevo << endl;
   cout << "Direccion puntero: " << &punteroNuevo << endl << endl;
  
   return 0;
  
  }
  
  
  int devuelve (int *punteroInt, int entero) {
   
   cout << "Variable param. puntero: " << punteroInt << endl;
   cout << "Variable param. puntero: " << *punteroInt << endl;
   cout << "Direccion param. puntero: " << &punteroInt << endl << endl;
   
   return (*punteroInt) + entero;
  
  } 

new y delete Con las instrucciones new y delete podemos reservar y liberar espacio libre de memoria. Se utilizan con los punteros (ademas de los objetos) y es muy necesario liberar siempre la memoria con la instruccion delete para evitar memory leaks: espacio de memoria marcados como okupados pero que ya no se usan porque el puntero que les correspondia ahora apunta a otro lado.

/**
  * Puntero.cpp
  * 
  * Clase que muestra la okupacion/liberacion de memoria 
  con new y delete
  * Pello Xabier Altadill Izura
  * Compilar: g++ Puntero.cpp -o Puntero
  */
  
  using namespace std;
  #include <iostream>
  
  int main () {
  
   // Creamos varias variables:
   int *pruebaInt = new int;
   short *pruebaShort = new short;
   pruebaInt = 777;
   pruebaShort = 23;
   
   // Ahora las mostramos por pantalla:
   cout << "Variable pruebaInt: " << pruebaInt << endl;
   cout << "Direccion pruebaInt: " << &pruebaInt << endl << endl;
   cout << "Variable pruebaShort: " << pruebaShort << endl;
   cout << "Direccion pruebaShort: " << &pruebaShort << endl << endl;
   
   // Liberamos la memoria
   delete pruebaInt;
   delete pruebaShort;
  
   // Contra la especulacion del sistema (operativo)
   // volvemos a oKupar un espacio de memoria
   int *pruebaInt = new int;
   short *pruebaShort = new short;
   pruebaInt = 666;
   pruebaShort = 21;
   
   // quiza tengamos un error, pero se puede comprobar:
   if ( pruebaInt == NULL || pruebaShort == NULL ) {
  
    cout << "Error al reservar memoria" << endl;
    return 0;
   
   }
  
   // Ahora las mostramos por pantalla:
   cout << "Variable pruebaInt: " << pruebaInt << endl;
   cout << "Direccion pruebaInt: " << &pruebaInt << endl << endl;
   cout << "Variable pruebaShort: " << pruebaShort << endl;
   cout << "Direccion pruebaShort: " << &pruebaShort << endl << endl;
  
   return 0;
  
  }

Objetos y punteros Se pueden crear punteros a objetos y atributos que son punteros. Veamos este ejemplo de una clase llamada Objeto:

/**
  * Objeto.hpp
  * 
  * Clase que muestra distintos tipos de punteros
  * que se usan con los objetos
  *
  * Pello Xabier Altadill Izura
  */
  
  using namespace std;
  #include <iostream>
  
  // Inicio de la clase
  class Objeto {
  
  private:
  
   int *privado;
  
  public:
  
   int atributo;
  
   // Constructor
   Objeto();
  
   // Constructor
   Objeto(int atributo);
  
   // Destructor
   ~Objeto();
  
   // Menu tipo case
   int devuelveAlgo();
  
  };

Y su implementacion:

/**
  * Objeto.cpp
  * 
  * Clase que muestra distintos tipos de punteros
  * que se usan con los objetos
  * Pello Xabier Altadill Izura
  * Compilar: g++ Objeto.cpp -o Objeto
  */
  
  #include "Objeto.hpp"
  
  // Constructor
  Objeto::Objeto(){
  
   atributo = 666;
  
  }
  
  
  // Constructor
  Objeto::Objeto(int atributo){
  
   this->atributo = atributo;
  
  }
  
  
  // Destructor
  Objeto::~Objeto(){}
  
  
  // Menu tipo case
  int Objeto::devuelveAlgo(){
  
   int temp = 0;
  
   return temp;
  
  }
  
  
  int main () {
  
   // Aqui guardaremos el resultado
   int resultado = 0;
  
   cout << " Vamos a jugar con los objetos." << endl;
  
   // Creamos la instancia del objeto puntero
   Objeto objeto = Objeto();
  
   //Creamos un puntero a ese objeto,
   // pero cuidado, no asignarle un constructor directamente
   Objeto *objetopuntero;
   
   // esto si...
   objetopuntero = &objeto;
   
   // Invocamos los metodos
   resultado = objeto.devuelveAlgo();
   
   // Observese la diferencia al acceder al atributo publico:
   cout << " El valor de atributo con Objeto es: " << objeto.atributo << endl;
   cout << " El valor de atributo con Objeto es: " << objetopuntero->atributo << endl;
  
   return 0;
  
  }

[editar]

22 opiniones

DamiaN

Mal exlicado :S,
no dice nada

agan algo de servicio por favor no mas estupidos
alegoria

cuando uno va a esplicar de progamacion primero se esplican los concepto, delas intrucciones,para que el estudiante sepa lo que se dice o de lo que se esta hablando, si es que esta pagina intructiva, sinoo no pongan estos ejemplo pues son tan astracto para los principiates que lo que hacen es asustarlos y seban , para esto de maestro, hay que ser humilde yno creer que como ya yo se no me importa lo que venga, no tomen esto, como algo mejoren, mejoren,mejoren, los quiero mucho migel.
Sobre nombre de array.

Hola, peter. Respecto a tu primera pregunta sobre cómo nombrar lo que en el código aparece como "array" en inglés, te puedo decir que no es correcta ninguna de las dos opciones que ofreces. Si se usa "arrays" se está españolizando la palabra inglesa "array". No muy conveniente, porque en español ya existe la palabra adecuada para ese concepto: "vector". De todos modos, españolizar una palabra inglesa en argot técnico no es tan grave como usar la palabra española traducida según una acepción inglesa incorrecta. Nunca se debería usar "arreglo".
Contenido insustancial.

Es poco afortunado el comentario que haces al referirte a los programadores la verdad no se a que te dediques pero me parece que a la diplomacia no y por lo visto a la docencia menos. Te falta mucho.
1 2 3 4 5 | siguiente >

Tutoriales relacionados con 'Tutorial de C++'

Este es el diario de Peter Class sobre sus dias aprendizaje de una disciplina de... Más »
Este tutorial presenta los conceptos básicos de líneas de transmisión (Transmission lines), así como una... Más »
Si tuviera que buscar un adjetivo para calificar a Sendmail, pensaría en "excesivo". Excesivo puesto... Más »
La red telefónica básica se creó para permitir las comunicaciones de voz a distancia. Esto... Más »
Bienvenidos al manual de HTML de Indaya.A través de todos estos capítulos vamos a descubrir... Más »

Autor y licencia de 'Tutorial de C++'


Tutorial de Peter Class; traducción por Pello Xabier Altadill Izura. Extraido de: http://es.tldp.org/Manuales-LuCAS/doc-tutorial-c++/html/ CopyLeft
Este documento se cede al dominio publico.
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.