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

标签 c pointers structure dereference anonymous-struct

在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/

相关文章:

c - 使用指针作为参数传递

c - 磁盘 I/O 的内核缓冲区缓存何时为空?

c - 如何从相关二进制文件中删除记录?

c - 列表未正确使用正则表达式管理的字符串

c++ - 如何确定将哪种类型传递给模板定义的函数?

c - unsigned long 到 char 数组

c - 用指针访问结构体的变量时,Cache 会带什么?

c - 为什么下面的程序给出输出 :A

ios - Swift:在 ViewController 的初始化例程中使用数据模型类结构

mysql - mysql中的多重选择结构