elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  C-Punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: C-Punteros  (Leído 1,337 veces)
pacman22

Desconectado Desconectado

Mensajes: 9


Ver Perfil
C-Punteros
« en: 7 Noviembre 2014, 02:03 am »

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 .
Código:
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
Código:
TipoLista crear_nodo(){
TipoLista nodo = NULL;

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

return nodo;
}


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: C-Punteros
« Respuesta #1 en: 7 Noviembre 2014, 08:48 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
  1. 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
  1. struct Nodo { /* ... */  };
  2. typedef struct Nodo tNodo;

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

Código
  1. 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
  1. 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
  1. 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.

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
  1. TipoLista nodo = FuncionQueMeDevuelveUnNodoValido( );
  2.  
  3. TipoLista siguiente1 = nodo->sig;
  4. 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.


« Última modificación: 7 Noviembre 2014, 10:48 am por eferion » En línea

pacman22

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: C-Punteros
« Respuesta #2 en: 7 Noviembre 2014, 10:37 am »

Genial! gracias  :D ,ahora todo va cerrando conceptualmente en mi cabeza .
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
punteros
Programación Visual Basic
bautistasbr 4 2,099 Último mensaje 30 Septiembre 2005, 19:35 pm
por NYlOn
Duda Punteros Dobles/Array de punteros
Programación C/C++
MisterJava 2 4,927 Último mensaje 30 Diciembre 2012, 20:19 pm
por MisterJava
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines