假设:
typedef Card* Cardptr;
这是否意味着以下声明中的foo
Cardptr foo;
与此声明中的相同?:
struct Card{
} *foo;
*
符号的外观让我感到困惑,因为它出现在我们已经发出的声明中与卡片相邻,并且在foo
的声明中与*foo
相邻
答案 0 :(得分:2)
这是否意味着以下声明中的foo与此声明中的相同? ...
是和否。我说是的,因为两个声明都声明了一个名为Card
的类型的指针变量(在C ++中,对于C也应用,它必须是struct Card
)。但它并不完全相同。
第一个声明可以引入所谓的“不透明句柄”。该结构不需要在那时完全定义。您可以将指针传递给它,但在看到完整定义之前,您将无法访问任何成员。
第二个声明引入了完整类型并立即创建了一个指向它的指针。它等同于看到完整结构定义后的第一种情况。
*
符号的外观让我感到困惑,因为它在我们给出的语句中显示在Card
附近,并且在foo
的语句中显示在*foo
旁边}}
*
的邻接并不重要。因为无论你在哪里写它都应用相同。它修改新声明的实体,而不是类型。举例说明:
int *i, j;
将只创建一个名为i
的指针和一个名为j
的常规整数。由于typedef
语句遵循与变量声明相同的规则(typedef
关键字的应用只是改变了引入新对象的含义,引入了新的类型名称),{{1}的行为是等价的。这意味着:
*
typedef int *i, j;
再次仅修改*
。我们最终得到了两个别名。别名i
是指向i
的指针的新类型名称,int
是j
的别名。
事实上,我们可以按照以下方式重写它以获得相同的效果:
int
同样,因为typedef int j, *i;
仅修改了*
。
答案 1 :(得分:0)
[for C ++]是的:您可以在foo
定义的尾端创建一个Card*
变量struct Card
,如您所示,并且它等同于上面Cardptr foo
(假设Card
的早期定义),如:
struct Card {
};
typedef Card* Cardptr;
Cardptr foo;
人们有时为了简洁而做尾随*foo
的事情 - 它避免了重复这种类型。