可以" typedef"类型名称声明一个指向结构的指针,如" struct"定义呢?

时间:2017-08-31 05:14:16

标签: c++ c pointers struct typedef

假设:

typedef Card* Cardptr;

这是否意味着以下声明中的foo

Cardptr foo;

与此声明中的相同?:

struct Card{

} *foo;

*符号的外观让我感到困惑,因为它出现在我们已经发出的声明中与卡片相邻,并且在foo的声明中与*foo相邻

2 个答案:

答案 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的指针的新类型名称,intj的别名。

事实上,我们可以按照以下方式重写它以获得相同的效果:

int

同样,因为typedef int j, *i; 仅修改了*

答案 1 :(得分:0)

[for C ++]是的:您可以在foo定义的尾端创建一个Card*变量struct Card,如您所示,并且它等同于上面Cardptr foo(假设Card的早期定义),如:

struct Card {

};
typedef Card* Cardptr;
Cardptr foo;

人们有时为了简洁而做尾随*foo的事情 - 它避免了重复这种类型。