Определение указателя действует как предварительное объявление из struct node
. Использование такого объявления допускается до тех пор, пока указатель не разыменовывается до появления фактического определения структуры.
Это необходимо для того, чтобы разрешить такие конструкции:
struct list_node {
int value;
struct list_node *next;
};
Это типичное определение узла в связанном списке. Поле next
имеет тип struct list_node *
, но на данный момент struct list_node
еще не полностью определено. Если бы такие прямые объявления не были разрешены, такие конструкции были бы невозможны.
Вы также можете использовать такой указатель для передачи в функцию и получения возвращаемого значения. Например:
struct node *n = new_node();
set_node_value(n, 1);
Эти две функции могут быть определены в отдельном исходном файле, где известно полное определение struct node
. Структура в этом случае - непрозрачный тип , который пользователям библиотеки не требуется знать детали.