【问题标题】:Creating a pointer directly from a typedef struct definition直接从 typedef 结构定义创建指针
【发布时间】:2019-01-21 06:15:48
【问题描述】:

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

代码如下:

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

我对@9​​87654324@ 实际上是什么感到困惑。就像我上面说的,我认为它是指向adjlistnode 结构的指针列表的指针,但我不确定。我的假设是否正确?

【问题讨论】:

  • 请参阅Is it a good idea to typedef pointers? — TL;DR,答案通常是“否”,但函数指针可能是一个例外。我没有看到使用指针指针的 typedef;它主要是令人困惑的,可能不是很有用。你最好参考struct adjlistnode,或者制作你自己的健全的typedef:type struct adjlistnode AdjListNode;(选择你自己的大写方案)。
  • @JonathanLeffler - 就我个人而言,我更喜欢给函数类型本身加上别名,并用星号声明指向函数的指针。它也有一种很好的一致感觉。

标签: c pointers struct typedef


【解决方案1】:

围绕typedef 的规则可以简化为以下概括:如果您在C 中有任何有效的变量声明(没有externstaticregister 等存储类),然后在前面加上 typedef 将变量名称转换为新的类型名称,基于变量的类型。

所以在这里,没有typedef

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

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

但在您的帖子中,由于typedefAdjMatrix 是一个名称​​类型指向struct adjlistnode的指针。

【讨论】:

  • 它已经过时了,但 long unsigned typedef long ull; 是一个有效的 typedef — 但“存储类”(或 typedef应该放在第一位,GCC 会发出警告如果足够用力。
  • 感谢您这么快回答!现在这更有意义了!
【解决方案2】:

我认为它是指向 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 的指针

【讨论】:

  • 感谢您的建议!这段代码实际上是作为分配的起点给我的,AdjMatrix 应该是一个链表数组。我想我现在很清楚了,谢谢!
【解决方案3】:

来自typedef [强调添加]:

typedef 是 C 和 C++ 编程语言中的保留关键字。 用于为其他数据类型创建别名。 1 因此,它通常用于简化声明由结构和联合类型组成的复杂数据结构的语法,但在为不同长度的整数数据类型提供特定的描述性类型名称时同样常见。

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

你可以用它来声明这样的变量:

AdjMatrix pp_st_adjlistnode;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多