Понимание потока структуры в C - PullRequest
1 голос
/ 27 сентября 2011

Я пытаюсь узнать, как работают структуры в C. Я знаком с конструкторами в Java. Теперь у меня есть пример создания дерева в C со структурами.

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

В настоящее время я пытаюсь визуализировать, как это работает, я немного запутался, потому что эта структура содержит себя.

Ответы [ 10 ]

6 голосов
/ 27 сентября 2011

Я немного сбит с толку, потому что эта структура содержит себя.

Структура не содержит себя, а два указателя на структуру одного типа.Это ключевой момент для понимания.

Структура, содержащая себя, будет бессмысленной и не будет компилироваться, потому что это бесконечно рекурсивная зависимость.

3 голосов
/ 27 сентября 2011

Я думаю, что ваша путаница заключается в сравнении структуры с конструктором в Java. Ближайший эквивалент в Java будет class:

class ATreeNode{
      int value;
      ATreeNode left;
      ATreeNode right;
}

Как уже говорилось в других ответах, левый и правый узлы в структуре - это указатели - очень похожие (но не совсем такие) на ссылки в Java.

1 голос
/ 27 сентября 2011

Структура определяется таким образом, что она формирует связанный список.Внутри структуры вы определяете два указателя на структуры.Таким образом, структура не содержит себя, а содержит два указателя на два разных экземпляра структуры.Возможно даже, что указатель является указателем на саму структуру.

1 голос
/ 27 сентября 2011

Он не содержит себя, он содержит два указателя на одну и ту же оборону. Знак * перед leftPTR и rightPTR указывает на область памяти, где хранятся другие a_tree_node.

1 голос
/ 27 сентября 2011

struct не содержит его сам. Он содержит два указателя на его тип. Очень важное различие. Указатели не относятся к тому типу, на который они указывают, но могут быть разыменованы в том, на что они указывают позже.

0 голосов
/ 27 сентября 2011
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;};

Это объявление приведет к ошибке, так как компилятор не сможет вычислить его размер идет в бесконечной рекурсии.

0 голосов
/ 27 сентября 2011

Содержит адрес структуры симлара.Like позволяет взять узел дерева.

это означает, что один узел дерева также хранит адрес двух других похожих узлов дерева.

0 голосов
/ 27 сентября 2011

Это просто связанный список int, представляющий двоичное дерево.

0 голосов
/ 27 сентября 2011

Приходя из Java, вы уже знаете необходимые понятия, но испытываете недостаток в строгости C, применяемой к понятиям данных и указателей. leftPtr похож на переменную типа класса (например, Object) в Java, то есть он указывает на другой объект, может иметь значение Null или может указывать на другой объект.

0 голосов
/ 27 сентября 2011

Здесь в вопросе содержится указатель на struct a_tree_node. Размер типа указателя всегда постоянен, т.е. sizeof(unsigned integer) так что это не создаст никаких проблем при определении размера struct a_tree_node. Это не будет вложенным struct ... :):)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...