typedef defines a new type of data based on any other type. if you have a look at Platform.h in your Arduino 1.0 files, you'll see it used to define the u8, u16, u32... they're used at other places like the type.h (or something like that)
So, typedef is what is used to create the uintX_t types based on the C standard data types (char int, etc...). This is for portability, although I am yet to find C code that needs uint8 instead of unsigned char to run.
By using
struct car_t {
char *make;
int doors;
} myCar;
you define the compound data type struct car_t and instance a variable of that type named myCar.
However, if you use typedef :
typedef struct car_t {
char *make;
int doors;
} myCar;
you define a new variable type named myCar of the type struct car_t.
if you want, you can use:
struct car_t MomsCar; //Or...
myCar DadsCar;
I understand the confusion, but if you understand the syntax of the typedef and struct, it makes sense.
typedef OLD_DATA_TYPE NEW_DATA_TYPE;
example:
typedef struct {int age; char *name} person; //creates a datatype named person from a structure that has no name.
typedef struct human {int age; char *name} person; //creates a datatype named person from the struct human data type
as for the struct:
struct STRUCTURE_NAME {STRUCTURE_MEMBERS}; //and the optional of initializing a variable straight afterwards.
Does it make a bit more sense now?