[C] Introduccion a estructuras y apuntadores

Iniciado por edr89, 13 Septiembre 2013, 09:11 AM

0 Miembros y 1 Visitante están viendo este tema.

edr89

Hola, estoy aprendiendo estructuras y apuntadores, tengo un código muy básico:
#include <stdio.h>
void main()
{
    typedef struct coordinate
        {
            char nombre[15];
            int x,y;
        }coordinate;
    coordinate ubicacion_01,ubicacion_02;
    coordinate  *ptr_punto;
    ptr_punto=&ubicacion_01;
    puts("Escribe el nombre del lugar");
    gets(ptr_punto->nombre);
    printf("Lugar: %s",(*ptr_punto).nombre);
    getch();
}
}


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!

ecfisa

Hola edr89.

CitarSe 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.

CitarLa 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

Un ejemplo con inicialización:
#include <stdio.h>
#include <stdlib.h>

typedef struct {
 char nombre[15];
 float latitud;
 float longitud;
} coordinate;

int main()
{
 // inicializacion
 coordinate ubicacion_01 = {"",0,0};
 coordinate ubicacion_02 = {"Helsinki", 60.1699, 24.9384};
 coordinate *pt1, *pt2;

 pt1 = &ubicacion_01;
 pt2 = &ubicacion_02;

 printf("Escribe el nombre del lugar: ");
 fgets(pt1->nombre, 16, stdin);
 printf("Lugar: %s\n",pt1->nombre);
  //...
 printf("Lugar: %s\nLatitud: %f\nLongitud: %f",
   pt2->nombre, pt2->latitud, pt2->longitud);

 getchar();
 return 0;
}


Saludos :)



eferion

Cita de: edr89 en 13 Septiembre 2013, 09:11 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:


typedef struct coordinate
{
  char nombre[15];
  int x = 0,y = 0;
}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:


void func( )
{
  coordinate estructura;
  *estructura.nombre = 0;
  estructura.x= 0;
  estructura.y= 0;

  // ...
}


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

Cita de: edr89 en 13 Septiembre 2013, 09:11 AM
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.

edr89

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.

Cita de: eferion en 13 Septiembre 2013, 10:41 AM
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!


rir3760

Cita de: edr89 en 13 Septiembre 2013, 17:17 PMSe 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:
struct foo {
   int i;
   double d;
   char *p;
};

struct foo a = {0}; /* i == 0, d == 0.0, p == NULL */


Cita de: edr89 en 13 Septiembre 2013, 17:17 PMNo 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.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

edr89