[英]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中有任何有效的变量声明(没有诸如extern
, static
或register
等的存储类),则将typedef
放在最前面会变成变量名根据变量的类型转换为新的类型名称。
所以这里,没有typedef
:
struct adjlistnode {int node; int cost; struct adjlistnode *next;}
**AdjMatrix;
AdjMatrix
是类型指向struct adjlistnode
指针的变量。
但是在您的帖子中,由于typedef
AdjMatrix
, AdjMatrix
是指向struct adjlistnode
指针的类型指针的名称。
从typedef [添加重点]:
typedef是C和C ++编程语言中的保留关键字。 它用于为另一种数据类型创建别名 。 1因此,它通常用于简化声明由struct和union类型组成的复杂数据结构的语法,但在为长度可变的整数数据类型提供特定的描述类型名称时也很常见。
AdjMatrix
是struct adjlistnode **
类型的替代名称,它是指向struct adjlistnode
指针。
您可以使用它来声明变量,如下所示:
AdjMatrix pp_st_adjlistnode;
这意味着pp_st_adjlistnode
是一个指向struct adjlistnode
指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.