为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMTTMM 2021-06-08 13:51:39
在这里,我想展示一些我想知道的 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 类型没有完美定义,但他们如何知道类型?
查看完整描述

2 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

您只是为指向结构实例的指针分配内存。在编译时需要多少内存是无关紧要的,并且在运行时将是已知的。

分配字段时所需要的只是知道指针(或 Java 中的引用,在此上下文中基本相似)占用多少内存,而不是需要多少内存来存储它所指的内容。

是的,这过于简化了,尤其是在 Java 的情况下。但这是一般的想法。


查看完整回答
反对 回复 2021-06-10
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

C 的答案:


C的用于区分完整和不完整的类型。A型可引入作为不完整的类型和稍后完成在相同的翻译单元。不同之处在于,对于完整类型,编译器知道存储大小——对于不完整类型,它不知道。


如果你写


struct foo;

你已经声明了一个类型,但在这个阶段它是不完整的。对于不完整的类型,可以使用指向该类型的指针,但不能使用该类型本身的对象。现在,在您的示例中:


struct node{

    struct node *p_node;   //here

};

该不完整的类型struct node,在第一行之后已知的。因此,在第二行中使用指向该类型的指针是完全合法的。在第三行中,类型已完成,您现在可以使用类型为 的对象struct node。


旁注:C 中只有一种不完整的类型无法完成:void. 所以你总是可以使用指向 void ( void *) 的指针,但不能使用void值。


查看完整回答
反对 回复 2021-06-10
  • 2 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信