¿Cual es la diferencia? Duda con punteros y typedef

Iniciado por freecom4ever, 16 Febrero 2012, 03:48 AM

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

freecom4ever

¿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

typedef struct nodo tiponodo;
typedef tiponodo *ptiponodo;



2.-  Caso 2

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!

Ferno

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

do-while

¡Buenas!

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


typedef int* int_ptr; //cada vez que declares una variable de tipo int_ptr esta sera de tipo int*

typedef struct cosa cosa;
//ahora cuando quieras declarar una variable de tipo struct cosa, te puedes ahorrar la palabra struct, porque cosa es lo mismo que struct cosa

//...


¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

freecom4ever

#3
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:
#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:
#include <stdio.h>
#include <stdlib.h>

int main()
{

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


Codigo 3:
#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!

x64core

Citar

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




do-while

Cita de: freecom4ever en 16 Febrero 2012, 05:07 AM

#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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

rir3760

Cita de: freecom4ever en 16 Febrero 2012, 05:07 AMpd: 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:
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:
printf("%d %p\n", *puntero, (void *) &variable);

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