在K&R第6章中,声明如下:
struct{
int len;
char *str;
} *p;
我不明白这个指针 p 指向哪个结构,也不知道这样的指针定义是否有效,因为在书中给出的所有其他示例以及我在其他地方看到的示例中,在定义指向结构的指针时,需要提及结构的名称,即正在定义的类型。例如,
struct example{
int a;
...
}s1;
然后,
struct example *ptr = &s1;
因此,提到 ptr 指向类型结构示例而不仅仅是结构。
此外,特别感兴趣的是:
*p->str fetches whatever str points to; *p->str++ increments str after accessing whatever it points to (just like *s++);
我无法首先理解 p 是什么,因此也无法理解递增和取消引用。
这是怎么回事?
提前致谢!
附言我是新来的,所以对问题格式的任何反馈也将不胜感激。
最佳答案
struct
关键字的工作方式有点像 typedef
的扩展版本,只是您创建了一个复杂的自定义类型(称为结构)而不是为现有类型设置别名。如果只有一个东西需要使用声明的类型,则不需要为该类型提供显式名称。
您正在查看的第一个语句声明了一个具有两个字段的结构,但没有命名它。这称为匿名结构。但是,该声明确实提供了该类型的指针。
此类声明的一个可能用例是当您为外部库创建 header 时,甚至可能不是用 C 编写的。在这种情况下,结构类型可能不透明或不完整,并且您只需要对它的某些部分有一个方便的引用。使结构匿名可以防止您自己轻松分配它,但允许您通过指针与它交互。
更常见的是,您会看到这种表示法与命名结构或至少是别名结构结合使用。第二条语句可以重写为
struct example { ... } s1, *ptr;
在这种情况下,struct example *ptr = &s1;
将只是 ptr = &s1;
。
更常见的情况是使用带有 typedef
的匿名结构,创建不包含 struct
关键字的自定义类型名称。您的第二个示例可以重写为
typedef struct { ... } example, *pexample;
example s1;
pexample ptr; // alternatively example *ptr;
ptr = &s1;
请注意,在这种情况下,s1
的类型是 example
而不是 struct example
。
关于c - 这个类型结构定义的指针是什么意思(在 C 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47061871/