2楼正解。
楼主要想具体了解,要再回顾一下 typedef 语法:
int a; 就是声明一个整型变量,变量名是 a。那么 typedef int a 就是定义了一个整型类型的别名 a。
定义了之后,如果我再写 a b; 那么其效果相当于 int b; (我这例子举的不好,因为用 a 来作别名,可以说是糟糕透了)
再看一个相对复杂些的:
比如 struct a { ... }; 会定义一个名为 a 的 struct 结构。这时你再 struct a b, *c; 就会分别定义一个 a 类型的对象和一个指向 a 类型的指针。
同理如果你 typedef struct a b, *c; 就会分别定义 a 类型和指向 a 类型指针的别名。
你给的例子,就是把定义结构体和定义别名这两步压缩在一步里了。这种压缩的写法很见,因为会显得代码更紧凑一些。