为什么可以在定义自己之前声明类类型(在 Java 中)或结构类型(在 C 中)?

在这里,我想展示一些我想知道的 C 和 Java 示例


在 C 编程中,


struct node{

    struct node *p_node;   //here

};

在 Java 编程中,


public class node{

    public node nd= new node();  //here

}

class(struct)在完美定义自己之前,它们都有声明类型的共同点。


通过例子,你可以看到:struct node *pline 和public node nd= new node();line 在 '}' 或 ';' 之前被描述。


在这一行中,尽管 self 类型没有完美定义,但他们如何知道类型?


MMTTMM
浏览 145回答 2
2回答

月关宝盒

您只是为指向结构实例的指针分配内存。在编译时需要多少内存是无关紧要的,并且在运行时将是已知的。分配字段时所需要的只是知道指针(或 Java 中的引用,在此上下文中基本相似)占用多少内存,而不是需要多少内存来存储它所指的内容。是的,这过于简化了,尤其是在 Java 的情况下。但这是一般的想法。

潇潇雨雨

C 的答案:C的用于区分完整和不完整的类型。A型可引入作为不完整的类型和稍后完成在相同的翻译单元。不同之处在于,对于完整类型,编译器知道存储大小——对于不完整类型,它不知道。如果你写struct foo;你已经声明了一个类型,但在这个阶段它是不完整的。对于不完整的类型,可以使用指向该类型的指针,但不能使用该类型本身的对象。现在,在您的示例中:struct node{    struct node *p_node;   //here};该不完整的类型struct node,在第一行之后已知的。因此,在第二行中使用指向该类型的指针是完全合法的。在第三行中,类型已完成,您现在可以使用类型为 的对象struct node。旁注:C 中只有一种不完整的类型无法完成:void. 所以你总是可以使用指向 void ( void *) 的指针,但不能使用void值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java