"typedef"类型名称是否可以像"struct"定义那样声明指向结构的指针?

Can "typedef" type names declare a pointer to a struct, like "struct" definitions do?

本文关键字:声明 结构 指针 struct 类型 typedef 是否 定义      更新时间:2023-10-16

给定:

typedef Card* Cardptr;

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

Cardptr foo;

是否与本声明相同?:

struct Card{
} *foo;

*符号的出现让我感到困惑,因为它在我们给出的语句中出现在Card附近,而在具有*foo的语句中显示在foo附近

这是否意味着以下声明中的foo。。。与本声明中的内容相同吗。。。

是和否。我之所以说是,是因为这两个声明都声明了一个指向名为Card的类型的指针变量(在C++中,要应用C,它必须是struct Card(。但这并不完全一样。

第一个声明可以引入所谓的"不透明句柄"。此时不需要完全定义结构。您可以四处传递指向它的指针,但在看到完整的定义之前,您将无法访问任何成员。

第二个声明引入了完整的类型,并立即创建一个指向它的指针。这相当于看到完整结构定义后的第一种情况。

*符号的出现让我感到困惑,因为它在给定的语句中出现在Card附近,在具有*foo的语句中显示在foo附近

*的邻接性是不重要的。因为无论你在哪里写它,它都是一样的。它修改新声明的实体,而不是类型。举例说明:

int *i, j;

将只创建一个指针,名为i,以及一个正则整数j。由于typedef语句遵循与变量声明相同的规则(typedef关键字的应用只是将含义从引入新对象更改为引入新类型名称(,因此*的行为是等效的。意思是:

typedef int *i, j;

CCD_ 16再次仅修改CCD_ 17。我们最后得到了两个别名。别名i是指向int的指针的新类型名称,以及jint的别名。

事实上,我们本可以将其改写如下以获得相同的效果:

typedef int j, *i;

同样,因为*仅修改i

[对于C++]是:您可以在struct Card定义的末尾创建一个变量foo,它是Card*,如您所示,它等效于上面的Cardptr foo(假设Card的早期定义(,如中所示

struct Card {
};
typedef Card* Cardptr;
Cardptr foo;

为了简洁起见,人们有时会做后面的*foo,这样可以避免重复类型。