Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Ja_90 en 11 Noviembre 2014, 04:38 am



Título: Punteros a estructuras...???
Publicado por: Ja_90 en 11 Noviembre 2014, 04:38 am
Buenas por aqui otra vez jejeje..tratando de resolver dudas...
Estoy aprendidendo y leyendo acerca de los punteros...
Mi duda surge cuando quiero utilizar los punteros con estructuras..

Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::cin;
  4. using std::endl;
  5.  
  6. struct Estructura
  7. {
  8.     string nombre;
  9.     int Edad;
  10. };
  11.  
  12. int main()
  13. {
  14.    Estructura persona[2];  
  15.  
  16.    Estrucputa *ptr_persona = NULL; // Declaro puntero y lo inicializo
  17.  
  18.    // Hasta aqui todo va bien, pero como asigno el nombre y la edad que se
  19.    // pida al usuario para llenar el arreglo persona[2]
  20.  
  21.    // Normalmente sin punteros seria asi:
  22.  
  23.   for (int i=0 ; i<2 ; i++)
  24.   {
  25.       cout << "Ingrese nombre: ";
  26.       getline(cin,persona[i].nombre);
  27.       cout << "Ingrese edad: ";
  28.       cin >> persona[i].edad;
  29.       cin.ignore();
  30.   }
  31.  
  32.  // Y para imprimirlo seria:
  33.  
  34.   for (int i=0 ; i<2 ; i++)
  35.   {
  36.       cout << persona[i].nombre << endl;
  37.       cout << persona[i].edad << endl;
  38.   }
  39. }
  40.  

  Como haria esto con punteros??...Quiero ver como hacerlo con un ejemplo sencillo a ver si
  Puedo lograr algo mas complicado y entender como funcionan los punteros con las estructuras.
  He leido bastante pero no he visto un ejemplo concreto donde pueda ver esto que quiero hacer...

Muchas Gracias a quien me pueda colaborar, ando de autodidacta y no tengo a quien preguntar
en mi entorno acerca de estos temas.

EDITO: Es mediante la asignacion dinamica de memoria (eso creo), seguire leyendo, igualmente si alguien me  puedo dar una breve explicacion lo apreciaria mucho...


Título: Re: Punteros a estructuras...???
Publicado por: ivancea96 en 11 Noviembre 2014, 13:48 pm
Código
  1. ptr_persona = new Estructura[2];


El resto es igual.

Por cierto, pusiste Estrucputa en vez de Estructura.


Título: Re: Punteros a estructuras...???
Publicado por: eferion en 11 Noviembre 2014, 14:36 pm
Lo que te ha comentado ivancea96 es correcto.

Sin embargo creo que es conveniente hacer una matización:

* Si accedes a una estructura por valor, tienes que usar el operador de miembro '.' para acceder a sus elementos.
* Si accedes a una estructura a través de un puntero, entonces el operador que te permite acceder a los miembros de la estructura es el operador de puntero '->'.

Un ejemplo:

Código
  1. struct Estructura
  2. {
  3.  int dato;
  4. };
  5.  
  6. int main( )
  7. {
  8.  Estructura var1;
  9.  var1.dato = 5; // a var1 accedemos por valor.
  10.  
  11.  Estructura* ptr = &var1;
  12.  // ptr es un puntero, para acceder al miembro de la estructura tenemos que usar un el operador de puntero
  13.  std::cout << ptr->dato << std::endl;
  14.  
  15.  Estructura* lista = new Estructura[ 2 ];
  16.  
  17.  // "lista" es un puntero, pero "lista[x]" no, aquí estamos accediendo a la estructura por valor, necesitamos
  18.  // el operador de miembro
  19.  lista[ 0 ].dato = 44;
  20.  
  21.  Estructura** lista2 = new Estructura*[ 2 ];
  22.  lista2[ 0 ] = new Estructura( );
  23.  lista2[ 1 ] = new Estructura( );
  24.  
  25.  // "lista2" es un puntero doble, por tanto, "lista2[x]" es un puntero a una estructura. Para acceder a los
  26.  // miembros de dicha estructura necesitamos el operador de puntero.
  27.  lista2[ 0 ]->dato = 85;
  28.  
  29.  // Faltan los correspondientes "delete" para liberar la memoria reservada, pero no es lo que se
  30.  // está preguntando en este hilo.
  31. }


Título: Re: Punteros a estructuras...???
Publicado por: Ja_90 en 11 Noviembre 2014, 19:24 pm
Muchas gracias a ambos por sus respuestas...

eferion respecto a liberar memoria con delete, tengo entendido que siempre se debe realizar para que dicha memoria utilizada se pueda reutilizar por asi decirlo y evitar el desbordamiento (overflow), para asi evitar que el programa colapse. y segun lei se debe hacer asi:

Código
  1. delete [] (Nombre puntero);

Estoy en lo correcto?...eso es cuando tengo un arreglo de lo contrario solo seria :

Código
  1. delete (Nombre puntero);


Título: Re: Punteros a estructuras...???
Publicado por: eferion en 11 Noviembre 2014, 21:10 pm
lo que creas con new, lo borras con delete y lo que creas con new[] lo tienes que borrar con delete[]:

Código
  1. int* ptr = new int;
  2. delete ptr;
  3.  
  4. ptr = new int[10];
  5. delete[] ptr;