我得到了这个结构的实现:
struct NodoQ {
Etype elem;
NodoQ *sig;
};
以下是此代码,
typedef NodoQ *PtrNodoQ;
PtrNodoQ ppio, fin;
与此相同吗?
NodoQ* ppio;
NodoQ* fin;
答案 0 :(得分:6)
以下是此代码,
typedef NodoQ *PtrNodoQ; PtrNodoQ ppio, fin;
与此相同吗?
NodoQ* ppio; NodoQ* fin;
是的,它导致ppio
和fin
的指针类型完全相同。
至于你的评论
"我没有尝试,因为我的代码中到处都有第二个选项,并且只是不想放松一些时间......"
您可以轻松测试它:
void foo(PtrNodoQ p) {
}
void bar(NodoQ* p) {
foo(p);
}
和
void baz() {
NodoQ n;
foo(&n);
bar(&n);
}
编译完全正常,没有无效的类型转换警告或错误。
你也可以在this excellent reference(强调我的)中快速找到答案:
typedef-names是现有类型的别名,不是新类型的声明。 Typedef不能用于更改现有类型名称的含义(包括typedef-name)。声明后,只能重新声明typedef-name以再次引用相同的类型。 Typedef名称仅在它们可见的范围内有效:不同的函数或类声明可以定义具有不同含义的同名类型。
答案 1 :(得分:3)
如果你想要标准,[dcl.typedef]说明:
使用
typedef
说明符声明的名称变为 typedef-name 。在其声明范围内,a typedef-name 在语法上等同于关键字,并命名与标识符关联的类型 第8章中描述的方式。 typedef-name 因此是另一种类型的同义词。 typedef-name 可以 不以类声明(9.1)或枚举声明的方式引入新类型。 [例如:之后typedef int MILES, *KLICKSP;
结构
MILES distance; extern KLICKSP metricp;
都是正确的声明;
distance
的类型为int
,metricp
的类型为“指向int
的指针。” -end 例子]
在你的情况下,在
之后typedef NodoQ *PtrNodoQ;
类型PtrNodoQ
和Node*
完全相同,可以从那里开始互换使用。声明NodoQ* ppio;
和PtrNodoQ ppio;
完全相同。