Почему это не бесконечный цикл объявлений?
Хорошо, первым делом первым указатель это указатель , это не имеет значенияуказывает ли он на int
, char
, double
или struct
, это, по сути, адрес памяти, где что-то начинается, и его размер определяется архитектурой.Вот почему вы можете объявить указатель внутри struct
, который вы только что создали.Если вы запустите этот код:
struct node {
int val;
struct node next; // NOTE: I omitted * so it is not pointer it is struct
};
, это приведет к ошибке, поскольку struct node
равно неизвестно , его размер также неизвестен.Таким образом, по сравнению с:
struct node {
int val;
struct node *next;
};
Тип указателя известен, что неизвестно здесь, на что он указывает.Размер указателя также известен, поэтому вы не получите рекурсию.
Чтобы добраться до точки указателей .В Си это:
int a = 5;
int *p = &a;
char *c = p;
совершенно законно, и программист должен следить за этим.Таким образом, нижняя строка struct node *next
является указателем на (адрес) предположительно следующего узла.По этой причине у вас не возникает recursion
.
Как компилятор распознает структурный узел внутри структурного узла?
Это не так !!!Вот почему мой первый пример не работает !!!!Он распознает тип указателя.По сути, вы можете написать это так:
struct node {
int val;
void *next;
};
и для вашей машины это будет так же, как:
struct node {
int val;
struct node *next;
};
Надеюсь, это вам поможет.