这个类型结构定义的指针是什么意思(在C中)?

Eul*_*ian 22 c pointers structure dereference anonymous-struct

在K&R第6章中,声明如下:

struct{
    int len;
    char *str;
} *p;
Run Code Online (Sandbox Code Playgroud)

我无法理解这个指针p指向哪个结构,如果这样的指针定义甚至是有效的,因为在书中给出的所有其他示例和我看到的其他示例中,在定义指向结构的指针时,名称需要提及结构,即定义的类型.例如,

struct example{
    int a;
    ...
}s1;
Run Code Online (Sandbox Code Playgroud)

然后,

struct example *ptr = &s1;
Run Code Online (Sandbox Code Playgroud)

所以,提到ptr指向一个类型结构示例而不仅仅是struct.

此外,特别感兴趣的是:

*p-> str获取任何str点;*p-> str ++在访问它指向的任何内容后递增str(就像*s ++);

我无法首先遵循p是什么,因此,也不是增量和解除引用.

这里发生了什么?

提前致谢!

PS我是新来的,所以对这个问题的格式的任何反馈也将不胜感激.

Mad*_*ist 12

struct关键字的工作有点像的扩展版本typedef,除非你创建一个复杂的自定义类型(称为结构),而不是混淆现有类型.如果您只有一件事需要使用声明的类型,则不需要为该类型提供显式名称.

您正在查看的第一个语句声明了一个包含两个字段的结构,但没有为其命名.这称为匿名结构.但是,声明确实提供了该类型的指针.

这种声明的一个可能的用例是当你为外部库创建一个标题时,可能是一个甚至没有用C语言编写的标题.在这种情况下,结构的类型可能是不透明的或不完整的,你只需要可以方便地参考它的某些部分.使结构匿名可以防止您自己轻松地分配它,但允许您通过指针与它进行交互.

更常见的是,您将看到此符号与命名或至少别名结构一起使用.第二个陈述可以改写为

struct example { ... } s1, *ptr;
Run Code Online (Sandbox Code Playgroud)

在那种情况下,struct example *ptr = &s1;就是这样ptr = &s1;.

更常见的情况是使用匿名结构typedef,创建不包含struct关键字的自定义类型名称.你的第二个例子可以改写为

typedef struct { ... } example, *pexample;
example s1;
pexample ptr; // alternatively example *ptr;
ptr = &s1;
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下s1example和否的类型struct example.