Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: edr89 en 13 Septiembre 2013, 09:11 am



Título: [C] Introduccion a estructuras y apuntadores
Publicado por: edr89 en 13 Septiembre 2013, 09:11 am
Hola, estoy aprendiendo estructuras y apuntadores, tengo un código muy básico:
Código
  1. #include <stdio.h>
  2. void main()
  3. {
  4.    typedef struct coordinate
  5.        {
  6.            char nombre[15];
  7.            int x,y;
  8.        }coordinate;
  9.    coordinate ubicacion_01,ubicacion_02;
  10.    coordinate  *ptr_punto;
  11.    ptr_punto=&ubicacion_01;
  12.    puts("Escribe el nombre del lugar");
  13.    gets(ptr_punto->nombre);
  14.    printf("Lugar: %s",(*ptr_punto).nombre);
  15.    getch();
  16. }
  17. }

Pregunta:

Se deben inicializar las variables al crear una estructura?, si a x,y les doy el valor de cero el compilador me da error, hay algun problema si no inicializo el arreglo nombre y las variables enteras?

La sentencia typedef esta bien dentro de main? o debo declarar la estructura fuera como prototipo?
saludos!


Título: Re: [C] Introduccion a estructuras y apuntadores
Publicado por: ecfisa en 13 Septiembre 2013, 10:19 am
Hola edr89.

Citar
Se deben inicializar las variables al crear una estructura?, si a x,y les doy el valor de cero el compilador me da error, hay algun problema si no inicializo el arreglo nombre y las variables enteras?
No es estríctamente necesario si vas a asignarle valores a sus miembros antes de utilizarlos.

Citar
La sentencia typedef esta bien dentro de main? o debo declarar la estructura fuera como prototipo?
Si la declaras dentro de la función main sólo será accesible dentro de la misma. Revisar sobre el ámbito de las variables te va a aclarar ese tema: Ambito de las variables (http://c.conclase.net/curso/?cap=006#Dec_ambitovble)

Un ejemplo con inicialización:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct {
  5.  char nombre[15];
  6.  float latitud;
  7.  float longitud;
  8. } coordinate;
  9.  
  10. int main()
  11. {
  12.  // inicializacion
  13.  coordinate ubicacion_01 = {"",0,0};
  14.  coordinate ubicacion_02 = {"Helsinki", 60.1699, 24.9384};
  15.  coordinate *pt1, *pt2;
  16.  
  17.  pt1 = &ubicacion_01;
  18.  pt2 = &ubicacion_02;
  19.  
  20.  printf("Escribe el nombre del lugar: ");
  21.  fgets(pt1->nombre, 16, stdin);
  22.  printf("Lugar: %s\n",pt1->nombre);
  23.  //...
  24.  printf("Lugar: %s\nLatitud: %f\nLongitud: %f",
  25.    pt2->nombre, pt2->latitud, pt2->longitud);
  26.  
  27.  getchar();
  28.  return 0;
  29. }
  30.  

Saludos :)




Título: Re: [C] Introduccion a estructuras y apuntadores
Publicado por: eferion en 13 Septiembre 2013, 10:41 am
Se deben inicializar las variables al crear una estructura?, si a x,y les doy el valor de cero el compilador me da error, hay algun problema si no inicializo el arreglo nombre y las variables enteras?

A ver, si por inicializarlas te refieres a algo tal que:

Código
  1. typedef struct coordinate
  2. {
  3.  char nombre[15];
  4.  int x = 0,y = 0;
  5. }coordinate;

Pues no va a funcionar porque ahí estás definiendo el formato de la estructura, pero no estás reservando memoria para su uso.

Sin embargo cuando sí puedes inicializarla es una vez hayas creado alguna instancia de dicha estructura:

Código
  1. void func( )
  2. {
  3.  coordinate estructura;
  4.  *estructura.nombre = 0;
  5.  estructura.x= 0;
  6.  estructura.y= 0;
  7.  
  8.  // ...
  9. }

Los beneficios de inicializar las variables es que así garantizas que tienen valores válidos... esto es especialmente importante con punteros.

La sentencia typedef esta bien dentro de main? o debo declarar la estructura fuera como prototipo?

Lo lógico y normal es declarar las estructuras fuera de las funciones, de esta forma puedes utilizar dicha estructura desde cualquier parte del código simplemente poniendo el include correspondiente.

Además poniendo las estructuras fuera de las funciones consigues un código más legible.


Título: Re: [C] Introduccion a estructuras y apuntadores
Publicado por: edr89 en 13 Septiembre 2013, 17:17 pm
Gracias a ambos por la respuesta, me ha quedado mas claro, solo se reserva espacion en memoria una vez que se crean las variables de tipo estructura.

Los beneficios de inicializar las variables es que así garantizas que tienen valores válidos... esto es especialmente importante con punteros.
Se puede inicializar toda la estructura a cero? y no las variables individuales?

No estoy seguro de abrir un nuevo tema, para crear una estructura ligada, en este caso es posible autoreferenciar? Estamos viendo en clase estructuras que contienen un apuntador que apunta a otra estructura de la misma forma que contiene tambien un apuntador que da a otra estructura etc...

Como es que se utiliza esto? o como funciona?
Se podría por ejemplo guardar el itinerario de una persona que viajó por el mundo a traves de una estructura autoreferenciada? No quiero que me den el código pero sí me ayuden a entender el concepto

de antemano gracias!



Título: Re: [C] Introduccion a estructuras y apuntadores
Publicado por: rir3760 en 13 Septiembre 2013, 17:51 pm
Se puede inicializar toda la estructura a cero? y no las variables individuales?
Es posible, solo tienes que indicar el valor del primer campo y los restantes se inicializan a 0, 0.0 o NULL dependiendo de su tipo. Por ejemplo:
Código
  1. struct foo {
  2.   int i;
  3.   double d;
  4.   char *p;
  5. };
  6.  
  7. struct foo a = {0}; /* i == 0, d == 0.0, p == NULL */

No estoy seguro de abrir un nuevo tema, para crear una estructura ligada, en este caso es posible autoreferenciar? Estamos viendo en clase estructuras que contienen un apuntador que apunta a otra estructura de la misma forma que contiene tambien un apuntador que da a otra estructura etc...

Como es que se utiliza esto? o como funciona?
Los casos mas conocidos son las listas vinculadas y arboles. Tutoriales sobre ellos los puedes descargar de la pagina (en ingles) Stanford CS Education Library (http://cslibrary.stanford.edu/).

Un saludo


Título: Re: [C] Introduccion a estructuras y apuntadores
Publicado por: edr89 en 15 Septiembre 2013, 02:39 am
gracias no sabia del sitio, muy util!!  :)