Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: freecom4ever en 16 Febrero 2012, 03:48 am



Título: ¿Cual es la diferencia? Duda con punteros y typedef
Publicado por: freecom4ever en 16 Febrero 2012, 03:48 am
¿Me pueden explicar la diferencia?

Entiendo que typedef crea un nuevo tipo de dato a partir de un tipo de dato anterior, en este ejemplo el tipo de dato nuevo es struct nodo.  Pero el siguiente codigo que encontre utiliza un puntero (¿creo?) en mitad del typedef yo lo arregle y lo deje como debería ser (segun yo) en el Caso 2 pero no despeja mis dudas.

No me queda claro (si es que existe) la linea 2 del caso 1 y de existir cual es la diferencia con respecto al siguiente.

Nota: el struct esta definido previamente pero creo que no es importante al menos yo lo entiendo.

Saludos!

1.- Caso 1

Código:
typedef struct nodo tiponodo;
typedef tiponodo *ptiponodo;


2.-  Caso 2

Código:
typedef struct nodo tiponodo;
tiponodo *ptiponodo;

Por tomarte la molestia de leer el post.

Una persona en alguna parte del mundo estará muy feliz :D. Muchas Gracias!


Título: Re: ¿Cual es la diferencia? Duda con punteros y typedef
Publicado por: Ferno en 16 Febrero 2012, 04:03 am
El caso 1 es correcto.
Primero crea el tipo de dato "tiponodo".
Luego crea el tipo de dato "ptiponodo" (el cual es un puntero al tipo de dato tiponodo).

Por ende, en el programa, cuando quieras declarar un puntero al "tiponodo", simplemente se creará una variable de tipo "ptiponodo", ya que esa misma es un puntero a "tiponodo".

Espero no haberte mareado :P


Título: Re: ¿Cual es la diferencia? Duda con punteros y typedef
Publicado por: do-while en 16 Febrero 2012, 04:47 am
¡Buenas!

Lo que typedef hace es crear un alias de algun tipo de dato:

Código
  1. typedef int* int_ptr; //cada vez que declares una variable de tipo int_ptr esta sera de tipo int*
  2.  
  3. typedef struct cosa cosa;
  4. //ahora cuando quieras declarar una variable de tipo struct cosa, te puedes ahorrar la palabra struct, porque cosa es lo mismo que struct cosa
  5.  
  6. //...
  7.  

¡Saludos!


Título: Re: ¿Cual es la diferencia? Duda con punteros y typedef
Publicado por: freecom4ever en 16 Febrero 2012, 05:07 am
Amigo, de verdad muchas gracias.

peor lo siento por tratar de entender con manzanitas...  :huh: pero hay cosas que no comprendo todavia.

¿se refiere a algo como esto?

Codigo 1:
Código:
#include <stdio.h>
#include <stdlib.h>

int main()
{
typedef int entero;
typedef entero *puntero;
entero variable=6;
puntero pvariable=&variable;
printf("%d %d", *pvariable &variable);
}

No logro terminar de entender "typedef entero *puntero;" no deberia ser "*puntero" un tipo de dato? ¿porque desaparece el *? yo entiendo que el tipo de dato es puntero en el ejemplo y no *puntero... ¿porque?

pd: para llegar al codigo de arriba fui probando esto hasta que llegue a eso... (puedo estar equivocado)

Codigo 2:
Código:
#include <stdio.h>
#include <stdlib.h>

int main()
{

int variable=6;
int *puntero=&variable;
printf("%d %d", *puntero &variable); */
}

Codigo 3:
Código:
#include <stdio.h>
#include <stdlib.h>

int main()
{

typedef int entero;
entero variable=6;
entero *puntero=&variable;
printf("%d %d", *puntero &variable);
}

¿Codigo 3 es la traducción de Codigo 1?

Muchas gracias... se pasaron n_n gracias de corazon!


Título: Re: ¿Cual es la diferencia? Duda con punteros y typedef
Publicado por: x64core en 16 Febrero 2012, 08:31 am
Citar
Código:
1.-  Caso 1

typedef struct nodo tiponodo;
typedef tiponodo *ptiponodo;


2.-  Caso 2

Código:
typedef struct nodo tiponodo;
tiponodo *ptiponodo;

en el primer caso creas un alias de tipo nodo que se llamara "tiponodo"
luego creas otro alias de tipo puntero a tiponodo que se llamara "ptiponodo"

en el segundo caso creas un alias de tipo estructura nodo que se llamara "tiponodo"
luego la segunda linea del caso 2 haces una declaracion de un puntero de tipo "tiponodo" que se llama "ptiponodo".

en conclusion en el primer caso solo haces definiciones de tipos para variables, no declaras nada de variables ni puntero, en cambio en el segundo
caso; en la segunda linea haces una declaracion de un puntero a una estructura que esta a su vez es de tipo "nodo".





Título: Re: ¿Cual es la diferencia? Duda con punteros y typedef
Publicado por: do-while en 16 Febrero 2012, 15:11 pm

Código:
#include <stdio.h>
#include <stdlib.h>

int main()
{
typedef int entero;
typedef entero *puntero;
entero variable=6;
puntero pvariable=&variable;
printf("%d %d", *pvariable &variable);
}

Asi es. El tipo de dato es int *, que significa puntero a int.

¡Saludos!


Título: Re: ¿Cual es la diferencia? Duda con punteros y typedef
Publicado por: rir3760 en 16 Febrero 2012, 17:27 pm
pd: para llegar al codigo de arriba fui probando esto hasta que llegue a eso... (puedo estar equivocado)
No hagas eso. En su lugar lee un buen libro y en base a el avanzas, en caso de duda el mentado o foros como este.

Ello porque en C cuando ocurre un error se genera "comportamiento no definido", en otras palabras todo mundo se lava las manos, puede ocurrir cualquier cosa y, por supuesto, la culpa es del programador. Sacar en base a ello conclusiones no es una buena idea.

En cuanto al ultimo programa tiene dos errores en la llamada a printf:
Código:
printf("%d %d", *puntero &variable);
Falta la coma que separa a los dos últimos argumentos y si se desea imprimir una dirección de memoria se debe utilizar "%p" y convertir el puntero explícitamente al tipo "void *", de esta forma:
Código
  1. printf("%d %p\n", *puntero, (void *) &variable);

Un saludo