繁体   English   中英

直接从typedef结构定义创建指针

[英]Creating a pointer directly from a typedef struct definition

我想检查以下代码的含义。 我想我正在创建一个指向adjlistnode结构的指针列表的指针,但是我不确定。

这是代码:

typedef struct adjlistnode {int node; int cost; struct adjlistnode *next;}
    **AdjMatrix;

我对**AdjMatrix实际上是什么感到困惑。 就像我在上面说的那样,我认为它是指向adjlistnode结构的指针列表的指针,但我不确定。 我的假设对吗?

我认为这是指向adjlistnode结构的指针列表的指针

不,不是。

AdjMatrix成为代表a pointer to pointer to struct adjlistnode的类型

例如,它可以像这样使用:

AdjMatrix p = NULL; // p is now a pointer to pointer to struct adjlistnode

该代码似乎是用于构建链接列表的,而AdjMatrix似乎是引用指向头指针的指针的AdjMatrix 它可以像这样使用:

void addNode(AdjMatrix pHead, int node, int cost)
{
    struct adjlistnode *tmp = malloc(sizeof *tmp);
    tmp->node = node;
    tmp->cost = cost;
    tmp->next = *pHead;
    *pHead = tmp;
}

void deleteNode(AdjMatrix pHead)
{
    if (*pHead)
    {
        struct adjlistnode *tmp = *pHead;
        *pHead = tmp->next;
        free(tmp);
    }
}

int main(void) {
    struct adjlistnode *head = NULL;

    // Add nodes
    addNode(&head, 1, 2);
    addNode(&head, 3, 4);
    addNode(&head, 5, 6);

    // ... use the list

    // Delete nodes
    while(head) deleteNode(&head);

    return 0;
}

注意,指针的typedef通常被认为是不好的做法。 相反,这样做会更好:

typedef struct adjlistnode {int node; int cost; struct adjlistnode *next;} AdjMatrix;

并像这样使用它:

void addNode(AdjMatrix **pHead, int node, int cost)

要清楚的pHead是指针的指针AdjMatrix

关于typedef的规则可以简化为以下概括:如果您在C中有任何有效的变量声明(没有诸如externstaticregister等的存储类),则将typedef放在最前面会变成变量名根据变量的类型转换为新的类型名称。

所以这里,没有typedef

struct adjlistnode {int node; int cost; struct adjlistnode *next;}
    **AdjMatrix;

AdjMatrix是类型指向struct adjlistnode指针的变量。

但是在您的帖子中,由于typedef AdjMatrixAdjMatrix是指向struct adjlistnode指针的类型指针的名称。

typedef [添加重点]:

typedef是C和C ++编程语言中的保留关键字。 它用于为另一种数据类型创建别名 1因此,它通常用于简化声明由struct和union类型组成的复杂数据结构的语法,但在为长度可变的整数数据类型提供特定的描述类型名称时也很常见。

AdjMatrixstruct adjlistnode **类型的替代名称,它是指向struct adjlistnode指针。

您可以使用它来声明变量,如下所示:

AdjMatrix pp_st_adjlistnode;

这意味着pp_st_adjlistnode是一个指向struct adjlistnode指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM