jka*_*ros 1 c struct pointers typedef
我一直在 learn-c.org 上学习 C
在介绍了有关 typedef 声明和结构的单元之后。他们完成了他们所谓的“链表的递归定义”,我发现相当简单,除了看起来不匹配的指针......
typedef struct node{
int val;
struct node* next;
}node_t
// usage
node_t* head = NULL;
head = (node_t*) malloc(sizeof(node_t));
head->val = 1;
head->next = (node_t*) malloc(sizeof(node_t));
head->next->val = 2;
head->next->next = (node_t*) malloc(sizeof(node_t));
head->next->next->val = 3;
Run Code Online (Sandbox Code Playgroud)
我的理解是,通过提供typedef struct node,我们能够next在结构中声明节点指针。
我的困惑发生在第 11 行。我们为下一个节点动态分配内存,但我们将 void 指针转换为指针node_t,而不是node指针——尽管事实上它head->next是一种(node*)类型。为什么这是允许的?C 是否只是(node*)在幕后重铸为 a,并(node_t*)用于可读性?
等价typedef于,因此在任何您可能使用的地方node_t都可以使用更短的。所以相当于.struct nodestruct nodenode_t(node_t*)(struct node*)
一个例外是在结构声明本身内部,因为定义的名称在声明之后才可用typedef(就像在声明函数或变量之前不能使用它们一样)。
顺便说一句,没有必要强制转换malloc(). 它返回void*,并且 C 允许将其分配给任何指针类型,而无需显式强制转换。请参阅我是否会转换 malloc 的结果?