我正在尝试学习结构如何在C中工作。我熟悉Java中的构造函数。现在,我有一个使用结构在C中创建树的示例。
struct a_tree_node{
int value;
struct a_tree_node *leftPTR, *rightPTR;
};
我目前正在尝试想象它是如何工作的,我有点困惑,因为这个结构包含它自己。
答案 0 :(得分:6)
我有点困惑,因为这个结构包含自己。
结构不包含自身,而是指向同一种结构的两个指针。这是理解的关键点。
包含自身的结构将是无意义的,不会编译,因为它是一个无限递归的依赖。
答案 1 :(得分:3)
我认为你的困惑是将结构与Java中的构造函数进行比较。 Java中最接近的等价物是class
:
class ATreeNode{
int value;
ATreeNode left;
ATreeNode right;
}
正如其他答案所说,结构中的左右节点都是指针 - 与Java的引用非常相似(但不完全相同)。
答案 2 :(得分:1)
struct
不包含自己。它包含两个指向其类型的指针。一个非常重要的区别。指针不是那种类型的指针,而是可以取消引用它们在以后指出的内容。
答案 3 :(得分:1)
它不包含它本身包含两个指向同一个defenition的指针。 leftPTR和rightPTR前面的*指向存储其他a_tree_node的内存位置。
答案 4 :(得分:1)
结构的定义方式使它形成一个链表。在struct中,你定义了两个指向结构的指针。因此,结构不包含自身,而是包含两个指向结构的两个不同实例的指针。甚至可能指针是指向结构本身的指针。
答案 5 :(得分:0)
当来自Java时,您已经知道必要的概念,但缺乏严格的C强制执行数据和指针的概念。 leftPtr就像Java中类类型的变量(如Object),也就是说,它指向另一个对象,可能是Null或者可能指向另一个对象。
答案 6 :(得分:0)
它只是表示二叉树的int的链接列表。
答案 7 :(得分:0)
它包含类似结构的地址。 就像让我们拿一个树节点一样。
这意味着单个树节点还存储了两个其他类似树节点的地址。
答案 8 :(得分:-1)
此问题中包含指向struct a_tree_node
的指针。
指针类型的大小始终是常量,即sizeof(unsigned integer)
因此在定义struct a_tree_node
的大小时不会产生任何问题。
它不会是嵌套的struct
... :):)
答案 9 :(得分:-1)
struct a_tree_node{int value;struct a_tree_node *leftPTR, *rightPTR; };
这段代码可以正常工作,因为我们将指针指向结构而不是其对象,因为指针的大小不是特定于数据类型的。这将取决于您的操作系统有多少位,您的整数将占用多少字节
例如,在gcc sizeof(int)
上是4,因此sizeof(leftPTR)
也是相同的
所以在运行时不会有递归sizeof(a_tree_node)=12
(不考虑结构填充,因为它是编译器特定的)
struct a_tree_node{int value;struct a_tree_node left;};
此声明将导致错误,因为编译器无法计算其大小 进行有趣的递归。