Ver Mensaje Individual
  #8 (permalink)  
Antiguo 14/05/2014, 07:34
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: problema con arreglo de estruturas

Cita:
Iniciado por Principe_Azul Ver Mensaje
Hola, no sabía que el -> era lo mismo que hacer *, osea es un puntero, buen dato. Gracias!!
Cita:
no sabía que el -> era lo mismo
A ver realmente no son lo mismo eso es lo que son:

(*p).edad = 1; // Desreferenciar y acceder al campo edad.
p->edad = 2; // Acceso al campo edad con el operador flecha.

no puedes crear un puntero así:

int -> p; ni hacer ninguna otra cosa que sea para acceder al contenido desde el puntero

Esto es un puntero * y eso -> solo te permite acceder con -> a un campo desde un puntero ;)

Bueno esto no lo entenderías sin un código así que aquí va XD
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. struct alumno {
  4.     int edad;
  5.     char sexo; 
  6. };
  7.  
  8.  
  9. int main() {
  10.        
  11.     struct alumno unAlumno;  // Creamos una estructura tipo alumno y la llamamos unAlumno.
  12.     struct alumno * p;       // Creamos un puntero tipo alumno y lo llamamos p.
  13.  
  14.     unAlumno->edad = 10; //Veras que esta linea da error, ponga el // delante para que compile.
  15.     //La linea anterior da error por que unAlumno no es un puntero, solo puedes usar -> para acceder
  16.     //al campo edad desde un puntero.
  17.    
  18.     p = &unAlumno;   // Asociamos unAlumno con el puntero p
  19.     p->edad = 10;    // Ahora si podemos acceder desde p al campo edad con el operador ->
  20.    
  21.     *p.edad = 20;    // Tampoco puedes hacer esto. Para que funcione ponga el // delante.
  22.     (*p).edad = 20;  // Pero si obligas primero que se desreferencie con los operadores () ¡¡¡Funciona!!!
  23.     //Al poner () en *p "(*p)" es como decir "Primero desreferencie y después acceda a la variable edad"
  24.     //-> quiere decir accede al campo edad;
  25.     //Por tanto (*p).edad y p->edad hacen lo mismo pero no son exactamente lo mismo ;)
  26.     return 0;  
  27. }
Intenta compilar esto.
Te va tirar error en algunas lineas y es que lo hice a propósito para que veas el funcionamiento de (*p).edad y p->edad.
En la linea que tire error ponga // delante a efecto de convertir la linea en comentario.
Observe el error emitido por el compilador y la linea donde esta el error.

Las lineas que van a dar error son linea 14 y 21, es solo para que veas.
En la linea 14 intento acceder a el campo edad con el operador -> desde un objeto alumno, Como es un objeto y no un puntero pues FAIL XD
Luego veras el -> trabajando desde un puntero.
Y por ultimo se ve la similitud que tienen (*p) y p->
-> nos viene mejor que (*p) por razones obvias..¿Que es mas fácil?:
p->edad;
o
(*p).edad;

No se tu me parece que -> es mas fácil
Así que si pasas un puntero a una función o lo que sea puedes usar el -> para acceder a sus campos dentro de dicha función, esto esta a la orden del día en c++ ;)
Entender como funciona las cosas es mejor que suponer, y no soy tan fiera en los punteros pero si quieres un consejo, gástate tiempo en entenderlos por que solo así vas a lograr dominar c/c++ ;)

Si alguien quiere seguir aportando información o ve algo malo, me encanta aprender :D

Última edición por vangodp; 14/05/2014 a las 07:41