我想检查以下代码的含义。我想我正在创建一个指向adjlistnode
结构的指针列表的指针,但是我不确定。
代码如下:
typedef struct adjlistnode {int node; int cost; struct adjlistnode *next;}
**AdjMatrix;
我对**AdjMatrix
的实际含义感到困惑。就像我在上面说的那样,我认为它是指向adjlistnode
结构的指针列表的指针,但是我不确定。我的假设对吗?
答案 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中有任何有效的变量声明(没有存储类,例如extern
,static
或{{ 1}}等),然后在变量前面加上register
,根据变量的类型将变量名转换为新的类型名。
所以这里没有typedef
:
typedef
struct adjlistnode {int node; int cost; struct adjlistnode *next;}
**AdjMatrix;
是指向AdjMatrix
的指针类型的变量。
但是在您的帖子中,由于struct adjlistnode
,typedef
是类型的名称指向AdjMatrix
的指针。
答案 2 :(得分:0)
来自typedef [已添加重点]:
typedef是C和C ++编程语言中的保留关键字。 它用于为另一种数据类型创建别名。 1因此,它通常用于简化声明由struct和union类型组成的复杂数据结构的语法,但在为长度可变的整数数据类型提供特定的描述类型名称时也很常见。
AdjMatrix
是struct adjlistnode **
类型的替代名称,它是指向struct adjlistnode
的指针。
您可以使用它来声明如下变量:
AdjMatrix pp_st_adjlistnode;
这意味着pp_st_adjlistnode
是指向struct adjlistnode
的指针。