struct a *a1;
объявляет a1
указателем на struct a
. Вы можете юридически объявить указатель
неполному struct
типу a
, потому что компилятору не нужно знать
определение struct a
для создания указателя на него. Все указатели на struct
типы имеют одинаковые требования к представлению памяти и выравниванию, и это
все, что нужно знать компилятору для его создания. Ваше назначение:
a1 = 0;
просто устанавливает указатель в 0, т. Е. Делает его нулевым указателем. Ничего не предполагает
о типе объекта, на который может указывать указатель. Если бы вместо этого вы были
попытаться что-то вроде:
a1->member = 0;
, что потребует от компилятора определения struct a
, а вы
увидит сбой компиляции как:
main.c:3:7: error: dereferencing pointer to incomplete type ‘struct a’
a1->member = 0;
^
Позже
Где мне нужно использовать этот синтаксис? Обычно для чего используется неопределенная структура?
Классическое использование неполных указателей struct
заключается в реализации абстрактного типа данных.
в C. C API, предоставляемый через заголовочный файл, определяется в терминах «непрозрачных» struct
указателей
- указатели на неполные типы - так что клиент может запросить
и манипулировать объектами, адресованными этими указателями, только через API и не может
обойти это, чтобы обрабатывать объекты неутвержденными способами, потому что они не могут видеть
определения типов данных, на которые указывают непрозрачные указатели! Вот элементарный пример
из C FAQ