typedef "definición de variables";
En C es posible definir nuevos tipos de variables a partir de construcciones con los tipos ya definidos. Para la definición de nuevos tipos se usa la palabra reservada typedef. En la sintaxis "definición de variables" es cualquier construcción válida que permita definir una o más variables derivadas de un tipo primitivo o uno previamente definido. El efecto es que las variables definidas se convierten en nuevos tipos. El nuevo tipo es como el de la variable que se hubiese definido sin el typedef. El nuevo tipo lo podremos utilizar a partir de este punto para definir nuevas variables.
typedef unsigned short int unshort;
define unshort como un unsigned short int y puede utilizarse posteriormente como tipo. Ejemplo:
unshort n1, *n2, n3[5];
Define: n1 un entero corto sin signo, n2 un puntero a entero corto sin signo, n3 un vector de enteros cortos sin signo.
Ejemplo con vectores:
typedef int vector[10]; void inicializaVector(vector v1) { int i; for(i=0;i<10;i++) v1[i]=0; }
Ejemplos de typedef con registros:
typedef struct { float real,imaginario; } complejo; complejo realAComplejo(float a) { complejo b; b.imaginario=0; b.real=a; return b; }
o equivalente al anterior, pero con un nombre de struct intermedio:
struct Scomplejo { float real,imaginario; }; typedef struct Scomplejo complejo; complejo realAComplejo(float a) { complejo b; b.imaginario=0; b.real=a; return b; }
Otro ejemplo con registros:
#include <stdlib.h> typedef struct NodoArbol { int info; struct NodoArbol *izq, *der; } TNodo; typedef struct NodoArbol *PNodo; int inserta(PNodo *p, int valor) { /* El primer parámetro es equivalente a: TNodo **p */ PNodo aux=*p; /* Equivalente a: struct NodoArbol *aux=*p; y también a: TNodo *aux=*p; */ if(aux==NULL) { aux = (PNodo) malloc(sizeof(TNodo)); /* Equivalente a: aux = (struct NodoArbol *) malloc(sizeof(struct NodoArbol)); */ /* y también a: aux = (TNodo *) malloc(sizeof(TNodo)); */ aux->info=valor; aux->izq=NULL; aux->der=NULL; *p=aux; return 1; } if(aux->info!=valor) if(valor<aux->info) return inserta(&(aux->izq),valor); else return inserta(&(aux->der),valor); else return 0; }