아주 간단한 차이만 설명하겠습니다.
typedef char *String_t;
#define String_d char *
String_t s1, s2;
String_d s3, s4;
s1, s2, s3는 char*형이지만 s4는 char형입니다.
일반적으로 char *s3, s4와 같은 의미로 보고 생각하시면 됩니다.
typedef는 스코프 규칙을 잘 따르는 장점이 있고, 매크로는 #ifdef를 쓸 수 있다는 장점이 있습니다.
잘 판단해서 이용해야 겠죠? ㅎㅎ