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

时间:2019-01-21 06:15:49

标签: c pointers struct typedef

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

代码如下:

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

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

3 个答案:

答案 0 :(得分:1)

  

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

不,不是。

AdjMatrix变成代表a pointer to pointer to struct adjlistnode

的类型

作为示例,它可以像这样使用:

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

该代码似乎是用于建立链接列表的,而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的指针

答案 1 :(得分:1)

围绕typedef的规则可以简化为以下概括:如果您在C中有任何有效的变量声明(没有存储类,例如externstatic或{{ 1}}等),然后在变量前面加上register,根据变量的类型将变量名转换为新的类型名。

所以这里没有typedef

typedef

struct adjlistnode {int node; int cost; struct adjlistnode *next;} **AdjMatrix; 是指向AdjMatrix的指针类型的变量。

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

答案 2 :(得分:0)

来自typedef [已添加重点]:

  

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

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

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

AdjMatrix pp_st_adjlistnode;

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