理解C中结构的流程

时间:2011-09-27 07:18:56

标签: c struct

我正在尝试学习结构如何在C中工作。我熟悉Java中的构造函数。现在,我有一个使用结构在C中创建树的示例。

struct a_tree_node{
      int value;
      struct a_tree_node *leftPTR, *rightPTR;
};

我目前正在尝试想象它是如何工作的,我有点困惑,因为这个结构包含它自己。

10 个答案:

答案 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;};

此声明将导致错误,因为编译器无法计算其大小 进行有趣的递归。