C 如何在结构本身内部使用结构指针
我正在学习以下C代码:C 如何在结构本身内部使用结构指针,c,data-structures,C,Data Structures,我正在学习以下C代码: typedef struct msg *m_; struct msg { long from; long to; m_ link; }; m_ queue; 我想看一个例子来解释指针的作用,即结构本身内部结构的m_link 非常感谢。要学究一点:link是一个指针m不是指针,而是typedef。它用于避免在结构定义中说“struct msg*link;” 正如上面注释中所回答的,队列由指向第一个项目的指针表示,该指针有指向第二个项目的指针(如果有
typedef struct msg *m_;
struct msg
{
long from;
long to;
m_ link;
};
m_ queue;
我想看一个例子来解释指针的作用,即结构本身内部结构的m_link
非常感谢。要学究一点:
link
是一个指针m
不是指针,而是typedef。它用于避免在结构定义中说“struct msg*link;”
正如上面注释中所回答的,队列由指向第一个项目的指针表示,该指针有指向第二个项目的指针(如果有),依此类推,直到到达空指针为止
struct linked_stack
{
int data;
struct linked_stack *next;
};
void linked_stack_push(linked_stack **stck, int data)
{
struct linked_stack *node = malloc(sizeof(struct linked_stack));
if (node != NULL)
{
node->data = data;
node->next = *stck;
}
*stck = node;
}
int linked_stack_top(linked_stack **stck)
{
if (*stck != NULL)
return (*stck)->data;
return 0; /* stack is empty */
}
void linked_stack_pop(linked_stack **stck)
{
struct linked_stack *node = *stck;
if (*stck != NULL)
{
*stck = node->next;
free(node);
}
}
在构建这样的列表时,一定要小心,不要让节点指向自身或任何前驱体,否则会出现无限循环追尾。指向结构本身内部结构类型的指针通常用于链接列表、树等。在您的示例中,它指的是队列实现 下面是使用链表的堆栈实现的一个非常简单的示例。函数需要堆栈指针的地址,空堆栈是空指针
struct linked_stack
{
int data;
struct linked_stack *next;
};
void linked_stack_push(linked_stack **stck, int data)
{
struct linked_stack *node = malloc(sizeof(struct linked_stack));
if (node != NULL)
{
node->data = data;
node->next = *stck;
}
*stck = node;
}
int linked_stack_top(linked_stack **stck)
{
if (*stck != NULL)
return (*stck)->data;
return 0; /* stack is empty */
}
void linked_stack_pop(linked_stack **stck)
{
struct linked_stack *node = *stck;
if (*stck != NULL)
{
*stck = node->next;
free(node);
}
}
用法示例:
int main(void)
{
struct linked_stack *stack = NULL;
linked_stack_push(&stack, 10);
printf("top of stack = %d\n", linked_stack_top(&stack));
linked_stack_pop(&stack);
return 0;
}
它通常用于每个结构“节点”指向下一个的链表。不要使用指针!这混淆了语义,使代码更难阅读/维护。@Olaf的建议在这里没有被广泛接受。自1979年以来,我看到和使用的大多数C代码都使用typedef作为指针。然而,有些人采取在名字后面加上
\u p
的做法。不管怎样,我都同意m
是个坏名字。@cliffordheath-可能是因为我很晚才开始使用C(1985年),我从未见过指针的typedef。克里夫·希思:在你陈述之前,你应该检查一下其他的问题。如果您想要混淆您的代码并混淆其他维护人员,那么欢迎您。甚至有一些编码标准明确地支持位到类型定义指针,而neforcingtypedef struct
。然而,在70年代,我们用手工输入机器代码,不久前用穿孔卡片输入,许多人认为结构化编程是为娘娘腔设计的。如今,维护/可读性已成为编程的主要问题。Tempora mutantur.学究气:m
是struct msg*
的别名/同义词,因此它很好地指向。您应该使用标记来格式化文本。请告诉我“别名”的C标准定义。我想你会发现,m
实际上是一个typedef,这个别名在标准中没有定义(尽管“别名”对于代码优化者来说是个问题);这似乎是从其他地方开始的,你是对的,它与标准本身中的typedef
无关。它实际上是一个或“同义词”(而人们可能会讨论“别名”是否不是“同义词”的同义词)。