C-Punteros

Iniciado por pacman22, 7 Noviembre 2014, 02:03 AM

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

pacman22

Hola, no estoy entendiendo como funcionan los punteros en c, y como funciona definir una variable tipo puntero, sobre todo al trabajar con listas enlazadas .

Esta es la estructura del nodo, según lo que entiendo yo , en tNodo tengo el dato a guardar, y la dirección del siguiente nodo .  Y luego defino un alias tipo puntero (?) de tipo tNodo .
typedef struct Nodo{
tElemento dato;
struct Nodo *sig;
}tNodo;

typedef tNodo *TipoLista;


Luego aca,por ejemplo al crear nodo , lo que hago es definir un puntero(nodo) de TipoLista(tNodo),lo que no entiendo es ahora, para modificar los valores que apunta esa direccion de memoria , no tengo que poner * primero, ejemplo *nodo->dato=carga_uno() ?? . Estoy confundido :S
TipoLista crear_nodo(){
TipoLista nodo = NULL;

nodo = (TipoLista) malloc(sizeof(TipoLista));
nodo->dato = carga_uno();
nodo->sig = NULL;

return nodo;
}

eferion

#1
Cita de: pacman22 en  7 Noviembre 2014, 02:03 AM
Esta es la estructura del nodo, según lo que entiendo yo , en tNodo tengo el dato a guardar, y la dirección del siguiente nodo .  Y luego defino un alias tipo puntero (?) de tipo tNodo .

Código (cpp) [Seleccionar]
typedef struct Nodo { /* ... */  } tNodo;

Ahí estás definiendo una estructura, cuyo nombre oficial es "struct Nodo", a dicha estructura le asignas un alias, "tNodo". De esta forma "struct Nodo" y "tNodo" son equivalentes. Se podría hacer también en dos pasos (por si te resulta más claro):

Código (cpp) [Seleccionar]
struct Nodo { /* ... */  };
typedef struct Nodo tNodo;


En la primera línea se define la estructura "Nodo" y en la segunda creamos el alias.

Código (cpp) [Seleccionar]
typedef tNodo *TipoLista;

Ahí estás creando un alias nuevo, "TipoLista", este alias es equivalente a "tNodo*", es decir, es un puntero a una estructura de tipo "tNodo"

Código (cpp) [Seleccionar]
nodo = (TipoLista) malloc(sizeof(TipoLista));

Si TipoLista es un alias de "struct Nodo*" entonces sizeof(TipoLista) devuelve el tamaño de un puntero, no de una estructura. La consecuencia es que no estás reservando la memoria suficiente para almacenar una estructura de tipo "Nodo". Hay que ser cuidadoso a la hora de usar alias, si en algún momento no tienes claro el uso del alias vas a meter la pata fijo.

Código (cpp) [Seleccionar]
nodo = (TipoLista) malloc(sizeof(tNodo));

Ahora, malloc reservará una cantidad de memoria suficiente para almacenar un "struct Nodo" y te devolverá el puntero correspondiente, que sí podrás usar sin problemas porque no vas a pisar memoria que no te pertenece.

Cita de: pacman22 en  7 Noviembre 2014, 02:03 AM
no tengo que poner * primero, ejemplo *nodo->dato=carga_uno() ??

Hay dos formas de acceder a los elementos de una estructura a la que accedes a través de un puntero:

Código (cpp) [Seleccionar]

TipoLista nodo = FuncionQueMeDevuelveUnNodoValido( );

TipoLista siguiente1 = nodo->sig;
TipoLista siguiente2 = (*nodo).sig;


"siguiente1" y "siguiente2" van a apuntar ambas al mismo sitio. En el primer caso hemos hecho uso del operador de referencia "->". Este operador indica que nuestra variable es realmente un puntero y que accedemos a sus elementos por referencia, no por valor. En el segundo caso estamos haciendo uso del operador "*" que nos permite acceder por valor a los elementos del puntero, como ya no estamos trabajando con punteros debemos usar el operador "." para acceder a sus elementos.

No se si con estas explicaciones te aclaro un poco el asunto. Si tienes más dudas no tengas inconveniente en preguntar.

Un saludo.

pacman22

Genial! gracias  :D ,ahora todo va cerrando conceptualmente en mi cabeza .