Не могли бы вы объяснить указатели и рекурсивные структуры

Не могли бы вы объяснить, что означают указатели внутри структур? и как рекурсивная структура может быть полезна? и не могли бы вы объяснить этот код для меня, пожалуйста? и как он будет вести себя в памяти?
Вот мой код C:

struct State {
unsigned long Out;
unsigned long Time; //ms
const struct State *Next[4];};

-4

Решение

В этом случае, Next может содержать 4 указателя на объекты одного типа (struct State) в адресах только для чтения (4 неизменяемых ссылки).

Пример:

#include <stdio.h>
#include <stdlib.h>

struct State {
unsigned long Out;
unsigned long Time; //ms
const struct State *Next[4];
};

void fn(struct State *data)
{
/* data->Next[0]->Out = 1; error: assignment of member ‘Out’ in read-only object */
for (int i = 0; i < 4; i++) {
printf("%ld %ld\n", data->Next[i]->Out, data->Next[i]->Time);
free((struct State *)data->Next[i]); /* cast to non const */
}
}

int main(void)
{
struct State data;
struct State *next;

for (int i = 0; i < 4; i++) {
next = malloc(sizeof(*next));
next->Out = i;
next->Time = i * 10;
data.Next[i] = next;
}
fn(&data);
return 0;
}
1

Другие решения

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

const struct State *Next[4]; array of pointer.

Таким образом, он может быть использован для указания 4 адреса, ссылающихся на себя.

Найдите пример связанного списка в ссылке ниже

http://www.thegeekstuff.com/2012/08/c-linked-list-example/

1

Это не «рекурсивный struct«. Содержит указатель наState это не то же самое, что иметь члена State, Следующий код вызовет ошибку:

// error!!
struct State {
unsigned long IN;
State someState;
};

Потому что внутренний State член должен будет иметь другого State член внутри него, и так далее, глубоко в рекурсивную кроличью нору.

Однако указатели на структуры могут быть полезны. Рассмотрим пример реализации связанного списка State Структуры. Концептуально это будет выглядеть так:

-----  ---> -----
| 9 |  |    | 5 |
-----  |    -----
| 5 |  |    | 4 |
-----  |    -----
|  -|---    |  -|----->
-----       -----

Второй член содержит указатель на другую структуру. Теперь в C ++ у вас обычно есть альтернативы. Например, в случае связанных списков вы можете сделать:

#include <list>

struct State {
unsigned long IN,
unsigned long OUT,
};

std::list<State> my_list;
1

Если у вас есть указатель внутри структуры, это означает, что указатель называется «Self referential Pointer». Этот указатель будет указывать на собственную структуру.

struct State {
unsigned long Out;
unsigned long Time; //ms
const struct State *Next[4]; // array of 4 self referential pointer.
};

Эти *Next[4] укажет на собственную структуру. Структура, которая содержит самоссылочный указатель, называется «Самоссылочная структура».

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

struct linked_list_node {
int data;
struct linked_list_node *next; // <- self reference
};
1
По вопросам рекламы [email protected]