有趣的C结构语法/类型

问题描述

| 我在Python解释器源代码中遇到了这个问题。
void
PyThread_delete_key_value(int key)
{
    long id = PyThread_get_thread_ident();
    struct key *p,**q;
有趣的部分是
struct key *p,**q;
通话。这个结构到底在做什么?我对这到底是什么结构感到困惑。这跟说的不一样吗?
struct 1 *p;
我很困惑。 编辑: 即使已经回答了这个问题,我也应该澄清我的问题。特别是这样的事实,单词“ 3”已被重用,并且我不知道编译器会在不同的命名空间中考虑它们。     

解决方法

        键存在于两个不同的命名空间中。一次作为变量,一次作为结构。编译器知道\'struct key \'和int key是不同的东西。     ,        “ 4”是指向“ 5”类型的对象的指针。 “ 6”是指向“ 5”类型的对象的指针的指针。 您可以这样定义一个结构:
struct key { int val; };
在这种情况下,类型为
struct key
struct
之后的
key
是类型(
struct key
)的一部分,并且不与整数参数ѭ3associated关联。     ,        这些是指向struct的指针。 p是指向键结构的指针,而q是指向键结构的指针的指针。很难看到这里发生了什么,而没有看到struct typedef或如何使用指针。     ,        首先,
int key
参数与声明中的
struct key
无关。那只是不幸的命名冲突。 尽管结构位于不同的命名空间中,所以它可以工作。 线
struct key *p,**q;
正在声明两个变量。 第一个名称为
p
,类型为
struct key *
。 第二个名称为
q
,类型为
struct key **
。 星号表示指针类型,它绑定到变量名而不是声明中的整体类型。 顺便说一句,正如我在mipadi的答案中所评论的那样,我有一位教授据说应该问Kernighan(或者可能是Ritchie)为什么C表达式会在语法上反映它们的声明。他说它将能够重用相同的解析代码。显然,C编译器几乎无法适应其编写的系统。 有时会很好,因为您可以确定是否有声明
int **foo[];
然后表达
**foo[3]
类型为23ѭ,而不必考虑太多。