Не могли бы вы объяснить, что означают указатели внутри структур? и как рекурсивная структура может быть полезна? и не могли бы вы объяснить этот код для меня, пожалуйста? и как он будет вести себя в памяти?
Вот мой код C:
struct State {
unsigned long Out;
unsigned long Time; //ms
const struct State *Next[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;
}
Вы можете ссылаться на пример связанного списка, чтобы понять, как использовать указатель на себя.
const struct State *Next[4]; array of pointer.
Таким образом, он может быть использован для указания 4 адреса, ссылающихся на себя.
Найдите пример связанного списка в ссылке ниже
Это не «рекурсивный 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;
Если у вас есть указатель внутри структуры, это означает, что указатель называется «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
};