一样的。
由于你使用了typedef,所以 struct Name 可以简单地写为 NAME,例如你例子中的 struct Name *p,可以简写为 NAME *p。
如果加上 const 修饰,就有区别了(下面我都用 NAME 代替 struct Name)。
两者都加上 const,分别是:
1、const NAME *p,意为变量指针 p 指向的是常量 NAME。
2、const PNAME p,意为常量指针 p 指向的是变量 NAME。
要理解两者的区别可能不是很容易,可以这样来看:const 与“类型”交换位置后,const是否跑到了指针(*)的右边,如果没有跑到右边,那么“指针是变量,指向的数据是常量”,跑到了右边就是“指针是常量,指向的数据是变量”。
以实例分析:const NAME *p,const 和类型交换位置,变为 NAME const *p,const 仍然在 * 的左边,所以指针 p 本身是变量,而指向的 NAME 是常量。
再分析 const PNAME p,这里要明白一点:PNAME 虽然是 NAME*,但typedef 已经将 NAME和*绑定了,就是说 PNAME 不能再拆开为 NAME *,于是交换后变为 PNAME const p,const 已经跑到了 * (原来的)的右边,所以指针 p 本身就是常量,指向的 NAME 是变量,这种定义还须注意一点:由于 p 是常量,所以在定义时就要初始化。